From 402597fbbaedd4e47f1262934bac7855d4709b91 Mon Sep 17 00:00:00 2001 From: Jan Hajek Date: Sun, 21 Jan 2024 20:02:05 +0100 Subject: [PATCH 01/12] major: big refactor --- cmd/.gitignore | 3 - cmd/main.go | 8 - go.mod | 61 +- go.sum | 302 +- src/{utils => }/archiveClient/handler.go | 0 .../archiveClient/handler_findFilesByRules.go | 8 +- .../handler_findFilesByRules_test.go | 0 .../archiveClient/handler_findGitFiles.go | 2 +- .../archiveClient/handler_tarFile.go | 0 .../archiveClient/handler_tarFiles.go | 0 .../archiveClient/handler_tarFiles_test.go | 0 .../archiveClient/handler_utils.go | 2 +- .../test/var/www/dir/file2.1.txt | 0 .../test/var/www/dir/file2.2.txt | 0 .../test/var/www/dir/subDir/file3.1.txt | 0 .../test/var/www/dir/subDir/file3.2.txt | 0 .../var/www/dir/subDir/file3.3.symlink.txt | 0 .../archiveClient/test/var/www/file1.1.txt | 0 src/cliAction/bucket/s3/handler.go | 27 - src/cliAction/bucket/s3/handler_create.go | 49 - src/cliAction/bucket/s3/handler_delete.go | 46 - src/cliAction/bucket/zerops/handler.go | 38 - src/cliAction/bucket/zerops/handler_create.go | 71 - src/cliAction/bucket/zerops/handler_delete.go | 65 - src/cliAction/buildDeploy/handler.go | 48 - .../buildDeploy/handler_checkInputValues.go | 26 - .../buildDeploy/handler_createAppVersion.go | 29 - src/cliAction/buildDeploy/handler_deploy.go | 178 - .../buildDeploy/handler_packageUpload.go | 27 - src/cliAction/buildDeploy/handler_push.go | 127 - .../buildDeploy/handler_savePackage.go | 37 - .../importProjectService/dataParse.go | 34 - src/cliAction/importProjectService/handler.go | 35 - .../handler_getClientId.go | 16 - .../importProjectService/handler_import.go | 63 - .../importProjectService/handler_project.go | 30 - .../importProjectService/handler_service.go | 26 - .../importProjectService/yamlContent.go | 57 - src/cliAction/installDaemon/handler.go | 26 - src/cliAction/installDaemon/handler_run.go | 26 - src/cliAction/login/handler.go | 171 - .../login/handler_parseRestApiError.go | 62 - src/cliAction/removeDaemon/handler.go | 30 - src/cliAction/removeDaemon/handler_run.go | 42 - src/cliAction/serviceLogs/handler.go | 41 - .../serviceLogs/handler_getAppVersion.go | 72 - .../serviceLogs/handler_getContainerId.go | 72 - .../handler_getNameSourceContainerId.go | 46 - .../serviceLogs/handler_getServiceLogUrl.go | 46 - src/cliAction/serviceLogs/handler_run.go | 60 - src/cliAction/startStopDelete/handler.go | 50 - .../startStopDelete/handler_confirm.go | 45 - .../startStopDelete/handler_project.go | 42 - .../startStopDelete/handler_runCmd.go | 57 - .../startStopDelete/handler_service.go | 41 - src/cliAction/startVpn/handler.go | 42 - src/cliAction/startVpn/handler_run.go | 105 - src/cliAction/statusVpn/handler.go | 51 - src/cliAction/stopVpn/handler.go | 56 - src/cliStorage/handler.go | 12 +- src/cmd/args.go | 41 - src/cmd/bucket.go | 27 +- src/cmd/bucketS3.go | 62 +- src/cmd/bucketS3Create.go | 99 +- src/cmd/bucketS3Delete.go | 99 +- src/cmd/bucketZerops.go | 15 +- src/cmd/bucketZeropsCreate.go | 93 +- src/cmd/bucketZeropsDelete.go | 87 +- src/cmd/daemon.go | 23 - src/cmd/daemonInstall.go | 37 - src/cmd/daemonRemove.go | 53 - src/cmd/daemonRun.go | 84 - src/cmd/daemonRun_other.go | 34 - src/cmd/daemonRun_windows.go | 84 - src/cmd/deploy.go | 92 - src/cmd/di.go | 90 - src/cmd/init.go | 79 - src/cmd/log.go | 20 - src/cmd/login.go | 151 +- src/cmd/project.go | 18 +- src/cmd/projectDelete.go | 91 +- src/cmd/projectImport.go | 100 +- src/cmd/projectList.go | 23 + src/cmd/projectServiceImport.go | 70 + src/cmd/projectStart.go | 87 +- src/cmd/projectStop.go | 86 +- src/cmd/push.go | 102 - src/cmd/regionList.go | 63 - src/cmd/resources/zerops_yml.tmpl | 28 - src/cmd/root.go | 70 +- src/cmd/scope.go | 14 + src/cmd/scopeProject.go | 65 + src/cmd/scopeReset.go | 30 + src/cmd/service.go | 19 +- src/cmd/serviceDelete.go | 94 +- src/cmd/serviceDeploy.go | 209 + src/cmd/serviceImport.go | 75 - src/cmd/serviceList.go | 25 + src/cmd/serviceLog.go | 137 +- src/cmd/servicePush.go | 248 + src/cmd/serviceStart.go | 87 +- src/cmd/serviceStop.go | 91 +- src/cmd/status.go | 14 + src/cmd/statusInfo.go | 53 + .../{logShow.go => statusShowDebugLogs.go} | 35 +- src/cmd/uxHelpers.go | 37 + src/cmd/version.go | 21 +- src/cmd/vpn.go | 22 - src/cmd/vpnStart.go | 124 - src/cmd/vpnStatus.go | 38 - src/cmd/vpnStop.go | 38 - src/cmdBuilder/cmd.go | 149 + src/cmdBuilder/cmdBuilder.go | 13 + src/cmdBuilder/cmdBuilderBuildCobraCmd.go | 67 + src/cmdBuilder/cmdBuilderCreateRunFunc.go | 289 + .../cmdBuilderCreateRunFunc_test.go | 178 + src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 81 + src/cmdBuilder/dependencyTree.go | 49 + src/cmdBuilder/dependencyTreeProject.go | 77 + src/cmdBuilder/dependencyTreeService.go | 61 + src/{utils => }/cmdRunner/run.go | 3 +- src/{utils => }/cmdRunner/run_test.go | 0 src/constants/darwin.go | 34 +- src/constants/dns.go | 6 - src/constants/general.go | 3 - src/constants/linux.go | 22 +- src/constants/params.go | 26 - src/constants/projectServiceActions.go | 14 - src/constants/windows.go | 31 +- src/constants/zerops.go | 71 + src/daemonInstaller/daemon.go | 15 - src/daemonInstaller/handler.go | 56 - src/daemonInstaller/handler_darwin.go | 200 - src/daemonInstaller/handler_linux.go | 21 - src/daemonInstaller/handler_linux_systemd.go | 184 - src/daemonInstaller/handler_windows.go | 163 - .../templates/systemd.service.tmpl | 31 - src/daemonServer/handler.go | 111 - src/daemonServer/handler_startVpn.go | 27 - src/daemonServer/handler_statusVpn.go | 11 - src/daemonServer/handler_stopVpn.go | 14 - src/daemonStorage/handler.go | 46 - src/entity/appVersion.go | 36 + src/entity/container.go | 19 + src/entity/project.go | 15 + src/entity/repository/appVersion.go | 113 + src/entity/repository/container.go | 61 + src/entity/repository/project.go | 100 + src/entity/repository/service.go | 143 + src/entity/service.go | 17 + src/errorsx/errors.go | 45 + src/{utils => }/httpClient/handler.go | 2 +- src/i18n/en.go | 468 +- src/i18n/i18n.go | 268 + src/logger/handler.go | 109 + src/{utils => }/logger/hooks.go | 29 +- src/{utils => }/logger/interface.go | 0 src/metaError/errors.go | 32 - src/nettools/pickIP.go | 19 - src/nettools/ping.go | 73 - src/nettools/read.go | 24 - src/{utils => }/params/handler.go | 67 +- src/prolongVpn/prolong.go | 110 - src/proto/daemon/build-pb | 14 - src/proto/daemon/build-pb-generate.go | 3 - src/proto/daemon/client.go | 18 - src/proto/daemon/client_address_darwin.go | 12 - src/proto/daemon/client_address_linux.go | 12 - src/proto/daemon/client_address_windows.go | 12 - src/proto/daemon/zeropsDaemonProtocol.pb.go | 546 - src/proto/daemon/zeropsDaemonProtocol.proto | 45 - .../daemon/zeropsDaemonProtocol_grpc.pb.go | 177 - src/proto/errors.go | 140 - src/proto/unary/interceptor.go | 40 - src/proto/vpnproxy/build-pb | 13 - src/proto/vpnproxy/build-pb-generate.go | 3 - src/proto/vpnproxy/client.go | 25 - src/proto/vpnproxy/protocol_extra.go | 60 - src/proto/vpnproxy/zeropsVpnProtocol.pb.go | 1012 - src/proto/vpnproxy/zeropsVpnProtocol.proto | 70 - src/proto/zBusinessZeropsApiProtocol/build-pb | 14 - .../build-pb-generate.go | 3 - .../zBusinessZeropsApiProtocol/client.go | 100 - .../protocol_extra.go | 31 - .../zeropsApiProtocol.pb.go | 17302 ---------------- .../zeropsApiProtocol.proto | 1662 -- .../zeropsApiProtocol_grpc.pb.go | 755 - src/region/config.go | 1 - src/region/region.go | 64 +- src/{cliAction => }/serviceLogs/constants.go | 2 - src/serviceLogs/handler.go | 39 + .../serviceLogs/handler_checkInputValues.go | 17 +- .../serviceLogs/handler_formatByRfc.go | 0 .../serviceLogs/handler_formatByTemplate.go | 4 +- .../handler_formatByTemplate_test.go | 0 .../serviceLogs/handler_formatLogs.go | 0 .../serviceLogs/handler_getLogs.go | 0 src/serviceLogs/handler_getServiceLogUrl.go | 35 + .../serviceLogs/handler_printLogs.go | 20 +- src/serviceLogs/handler_run.go | 19 + src/{cliAction => }/serviceLogs/handler_ws.go | 25 +- src/{utils => storage}/exists.go | 2 +- src/{utils => }/storage/handler.go | 34 +- src/{utils => }/storage/handler_test.go | 0 src/support/support.go | 2 +- src/utils/logger/handler.go | 75 - src/utils/processChecker/checkMultiple.go | 87 - src/utils/processChecker/checkProcess.go | 45 - src/utils/projectService/getClientId.go | 38 - src/utils/projectService/getProjectById.go | 40 - src/utils/projectService/getProjectId.go | 67 - src/utils/projectService/getService.go | 41 - src/utils/rw.go | 84 - src/utils/sdkConfig/handler.go | 6 - src/utils/vpnStatus.go | 31 - src/{utils => }/uuid/uuid.go | 4 +- src/uxBlock/blocks.go | 36 + src/uxBlock/logs.go | 40 + src/uxBlock/prompt.go | 142 + src/uxBlock/select.go | 191 + src/uxBlock/showcase/main.go | 162 + src/uxBlock/showcase/zerops.log | 54 + src/uxBlock/spinner.go | 190 + src/uxBlock/styles.go | 108 + src/uxBlock/table.go | 138 + src/uxHelpers/project.go | 84 + src/uxHelpers/service.go | 81 + src/uxHelpers/spinner.go | 99 + src/vpn/cleanVpn_darwin.go | 31 - src/vpn/cleanVpn_linux.go | 30 - src/vpn/cleanVpn_windows.go | 39 - src/vpn/commands.go | 76 - src/vpn/dnsClean.go | 44 - src/vpn/dnsCleanNetworkSetup.go | 21 - src/vpn/dnsDetect.go | 9 - src/vpn/dnsDetect_darwin.go | 17 - src/vpn/dnsDetect_linux.go | 88 - src/vpn/dnsDetect_windows.go | 12 - src/vpn/dnsIsAlive.go | 25 - src/vpn/handler.go | 36 - src/vpn/handler_stopVpn.go | 9 - src/vpn/isVpnTunnelAlive.go | 32 - src/vpn/public_startVpn.go | 33 - src/vpn/public_statusVpn.go | 66 - src/vpn/reloadVpn.go | 60 - src/vpn/setDns.go | 62 - src/vpn/setDnsNetworksetup.go | 40 - src/vpn/setVpn_darwin.go | 119 - src/vpn/setVpn_linux.go | 123 - src/vpn/setVpn_windows.go | 88 - src/vpn/startVpn.go | 226 - src/vpn/stopVpn.go | 31 - src/yamlReader/readYaml.go | 53 + src/zeropsRestApiClient/errors.go | 68 + src/zeropsRestApiClient/handler.go | 24 + .../handler_get_projects_by_client.go | 98 + .../handler_get_service_stacks_by_project.go | 106 + 257 files changed, 5658 insertions(+), 30081 deletions(-) delete mode 100644 cmd/.gitignore rename src/{utils => }/archiveClient/handler.go (100%) rename src/{utils => }/archiveClient/handler_findFilesByRules.go (88%) rename src/{utils => }/archiveClient/handler_findFilesByRules_test.go (100%) rename src/{utils => }/archiveClient/handler_findGitFiles.go (98%) rename src/{utils => }/archiveClient/handler_tarFile.go (100%) rename src/{utils => }/archiveClient/handler_tarFiles.go (100%) rename src/{utils => }/archiveClient/handler_tarFiles_test.go (100%) rename src/{utils => }/archiveClient/handler_utils.go (93%) rename src/{utils => }/archiveClient/test/var/www/dir/file2.1.txt (100%) rename src/{utils => }/archiveClient/test/var/www/dir/file2.2.txt (100%) rename src/{utils => }/archiveClient/test/var/www/dir/subDir/file3.1.txt (100%) rename src/{utils => }/archiveClient/test/var/www/dir/subDir/file3.2.txt (100%) rename src/{utils => }/archiveClient/test/var/www/dir/subDir/file3.3.symlink.txt (100%) rename src/{utils => }/archiveClient/test/var/www/file1.1.txt (100%) delete mode 100644 src/cliAction/bucket/s3/handler.go delete mode 100644 src/cliAction/bucket/s3/handler_create.go delete mode 100644 src/cliAction/bucket/s3/handler_delete.go delete mode 100644 src/cliAction/bucket/zerops/handler.go delete mode 100644 src/cliAction/bucket/zerops/handler_create.go delete mode 100644 src/cliAction/bucket/zerops/handler_delete.go delete mode 100644 src/cliAction/buildDeploy/handler.go delete mode 100644 src/cliAction/buildDeploy/handler_checkInputValues.go delete mode 100644 src/cliAction/buildDeploy/handler_createAppVersion.go delete mode 100644 src/cliAction/buildDeploy/handler_deploy.go delete mode 100644 src/cliAction/buildDeploy/handler_packageUpload.go delete mode 100644 src/cliAction/buildDeploy/handler_push.go delete mode 100644 src/cliAction/buildDeploy/handler_savePackage.go delete mode 100644 src/cliAction/importProjectService/dataParse.go delete mode 100644 src/cliAction/importProjectService/handler.go delete mode 100644 src/cliAction/importProjectService/handler_getClientId.go delete mode 100644 src/cliAction/importProjectService/handler_import.go delete mode 100644 src/cliAction/importProjectService/handler_project.go delete mode 100644 src/cliAction/importProjectService/handler_service.go delete mode 100644 src/cliAction/importProjectService/yamlContent.go delete mode 100644 src/cliAction/installDaemon/handler.go delete mode 100644 src/cliAction/installDaemon/handler_run.go delete mode 100644 src/cliAction/login/handler.go delete mode 100644 src/cliAction/login/handler_parseRestApiError.go delete mode 100644 src/cliAction/removeDaemon/handler.go delete mode 100644 src/cliAction/removeDaemon/handler_run.go delete mode 100644 src/cliAction/serviceLogs/handler.go delete mode 100644 src/cliAction/serviceLogs/handler_getAppVersion.go delete mode 100644 src/cliAction/serviceLogs/handler_getContainerId.go delete mode 100644 src/cliAction/serviceLogs/handler_getNameSourceContainerId.go delete mode 100644 src/cliAction/serviceLogs/handler_getServiceLogUrl.go delete mode 100644 src/cliAction/serviceLogs/handler_run.go delete mode 100644 src/cliAction/startStopDelete/handler.go delete mode 100644 src/cliAction/startStopDelete/handler_confirm.go delete mode 100644 src/cliAction/startStopDelete/handler_project.go delete mode 100644 src/cliAction/startStopDelete/handler_runCmd.go delete mode 100644 src/cliAction/startStopDelete/handler_service.go delete mode 100644 src/cliAction/startVpn/handler.go delete mode 100644 src/cliAction/startVpn/handler_run.go delete mode 100644 src/cliAction/statusVpn/handler.go delete mode 100644 src/cliAction/stopVpn/handler.go delete mode 100644 src/cmd/args.go delete mode 100644 src/cmd/daemon.go delete mode 100644 src/cmd/daemonInstall.go delete mode 100644 src/cmd/daemonRemove.go delete mode 100644 src/cmd/daemonRun.go delete mode 100644 src/cmd/daemonRun_other.go delete mode 100644 src/cmd/daemonRun_windows.go delete mode 100644 src/cmd/deploy.go delete mode 100644 src/cmd/di.go delete mode 100644 src/cmd/init.go delete mode 100644 src/cmd/log.go create mode 100644 src/cmd/projectList.go create mode 100644 src/cmd/projectServiceImport.go delete mode 100644 src/cmd/push.go delete mode 100644 src/cmd/regionList.go delete mode 100644 src/cmd/resources/zerops_yml.tmpl create mode 100644 src/cmd/scope.go create mode 100644 src/cmd/scopeProject.go create mode 100644 src/cmd/scopeReset.go create mode 100644 src/cmd/serviceDeploy.go delete mode 100644 src/cmd/serviceImport.go create mode 100644 src/cmd/serviceList.go create mode 100644 src/cmd/servicePush.go create mode 100644 src/cmd/status.go create mode 100644 src/cmd/statusInfo.go rename src/cmd/{logShow.go => statusShowDebugLogs.go} (56%) create mode 100644 src/cmd/uxHelpers.go delete mode 100644 src/cmd/vpn.go delete mode 100644 src/cmd/vpnStart.go delete mode 100644 src/cmd/vpnStatus.go delete mode 100644 src/cmd/vpnStop.go create mode 100644 src/cmdBuilder/cmd.go create mode 100644 src/cmdBuilder/cmdBuilder.go create mode 100644 src/cmdBuilder/cmdBuilderBuildCobraCmd.go create mode 100644 src/cmdBuilder/cmdBuilderCreateRunFunc.go create mode 100644 src/cmdBuilder/cmdBuilderCreateRunFunc_test.go create mode 100644 src/cmdBuilder/cmdBuilderExecuteRootCmd.go create mode 100644 src/cmdBuilder/dependencyTree.go create mode 100644 src/cmdBuilder/dependencyTreeProject.go create mode 100644 src/cmdBuilder/dependencyTreeService.go rename src/{utils => }/cmdRunner/run.go (96%) rename src/{utils => }/cmdRunner/run_test.go (100%) delete mode 100644 src/constants/dns.go delete mode 100644 src/constants/general.go delete mode 100644 src/constants/params.go delete mode 100644 src/constants/projectServiceActions.go create mode 100644 src/constants/zerops.go delete mode 100644 src/daemonInstaller/daemon.go delete mode 100644 src/daemonInstaller/handler.go delete mode 100644 src/daemonInstaller/handler_darwin.go delete mode 100644 src/daemonInstaller/handler_linux.go delete mode 100644 src/daemonInstaller/handler_linux_systemd.go delete mode 100644 src/daemonInstaller/handler_windows.go delete mode 100644 src/daemonInstaller/templates/systemd.service.tmpl delete mode 100644 src/daemonServer/handler.go delete mode 100644 src/daemonServer/handler_startVpn.go delete mode 100644 src/daemonServer/handler_statusVpn.go delete mode 100644 src/daemonServer/handler_stopVpn.go delete mode 100644 src/daemonStorage/handler.go create mode 100644 src/entity/appVersion.go create mode 100644 src/entity/container.go create mode 100644 src/entity/project.go create mode 100644 src/entity/repository/appVersion.go create mode 100644 src/entity/repository/container.go create mode 100644 src/entity/repository/project.go create mode 100644 src/entity/repository/service.go create mode 100644 src/entity/service.go create mode 100644 src/errorsx/errors.go rename src/{utils => }/httpClient/handler.go (98%) create mode 100644 src/i18n/i18n.go create mode 100644 src/logger/handler.go rename src/{utils => }/logger/hooks.go (66%) rename src/{utils => }/logger/interface.go (100%) delete mode 100644 src/metaError/errors.go delete mode 100644 src/nettools/pickIP.go delete mode 100644 src/nettools/ping.go delete mode 100644 src/nettools/read.go rename src/{utils => }/params/handler.go (60%) delete mode 100644 src/prolongVpn/prolong.go delete mode 100755 src/proto/daemon/build-pb delete mode 100644 src/proto/daemon/build-pb-generate.go delete mode 100644 src/proto/daemon/client.go delete mode 100644 src/proto/daemon/client_address_darwin.go delete mode 100644 src/proto/daemon/client_address_linux.go delete mode 100644 src/proto/daemon/client_address_windows.go delete mode 100644 src/proto/daemon/zeropsDaemonProtocol.pb.go delete mode 100644 src/proto/daemon/zeropsDaemonProtocol.proto delete mode 100644 src/proto/daemon/zeropsDaemonProtocol_grpc.pb.go delete mode 100644 src/proto/errors.go delete mode 100644 src/proto/unary/interceptor.go delete mode 100755 src/proto/vpnproxy/build-pb delete mode 100644 src/proto/vpnproxy/build-pb-generate.go delete mode 100644 src/proto/vpnproxy/client.go delete mode 100644 src/proto/vpnproxy/protocol_extra.go delete mode 100644 src/proto/vpnproxy/zeropsVpnProtocol.pb.go delete mode 100644 src/proto/vpnproxy/zeropsVpnProtocol.proto delete mode 100755 src/proto/zBusinessZeropsApiProtocol/build-pb delete mode 100644 src/proto/zBusinessZeropsApiProtocol/build-pb-generate.go delete mode 100644 src/proto/zBusinessZeropsApiProtocol/client.go delete mode 100644 src/proto/zBusinessZeropsApiProtocol/protocol_extra.go delete mode 100644 src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.pb.go delete mode 100644 src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.proto delete mode 100644 src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol_grpc.pb.go delete mode 100644 src/region/config.go rename src/{cliAction => }/serviceLogs/constants.go (83%) create mode 100644 src/serviceLogs/handler.go rename src/{cliAction => }/serviceLogs/handler_checkInputValues.go (80%) rename src/{cliAction => }/serviceLogs/handler_formatByRfc.go (100%) rename src/{cliAction => }/serviceLogs/handler_formatByTemplate.go (89%) rename src/{cliAction => }/serviceLogs/handler_formatByTemplate_test.go (100%) rename src/{cliAction => }/serviceLogs/handler_formatLogs.go (100%) rename src/{cliAction => }/serviceLogs/handler_getLogs.go (100%) create mode 100644 src/serviceLogs/handler_getServiceLogUrl.go rename src/{cliAction => }/serviceLogs/handler_printLogs.go (59%) create mode 100644 src/serviceLogs/handler_run.go rename src/{cliAction => }/serviceLogs/handler_ws.go (81%) rename src/{utils => storage}/exists.go (92%) rename src/{utils => }/storage/handler.go (72%) rename src/{utils => }/storage/handler_test.go (100%) delete mode 100644 src/utils/logger/handler.go delete mode 100644 src/utils/processChecker/checkMultiple.go delete mode 100644 src/utils/processChecker/checkProcess.go delete mode 100644 src/utils/projectService/getClientId.go delete mode 100644 src/utils/projectService/getProjectById.go delete mode 100644 src/utils/projectService/getProjectId.go delete mode 100644 src/utils/projectService/getService.go delete mode 100644 src/utils/rw.go delete mode 100644 src/utils/sdkConfig/handler.go delete mode 100644 src/utils/vpnStatus.go rename src/{utils => }/uuid/uuid.go (82%) create mode 100644 src/uxBlock/blocks.go create mode 100644 src/uxBlock/logs.go create mode 100644 src/uxBlock/prompt.go create mode 100644 src/uxBlock/select.go create mode 100644 src/uxBlock/showcase/main.go create mode 100755 src/uxBlock/showcase/zerops.log create mode 100644 src/uxBlock/spinner.go create mode 100644 src/uxBlock/styles.go create mode 100644 src/uxBlock/table.go create mode 100644 src/uxHelpers/project.go create mode 100644 src/uxHelpers/service.go create mode 100644 src/uxHelpers/spinner.go delete mode 100644 src/vpn/cleanVpn_darwin.go delete mode 100644 src/vpn/cleanVpn_linux.go delete mode 100644 src/vpn/cleanVpn_windows.go delete mode 100644 src/vpn/commands.go delete mode 100644 src/vpn/dnsClean.go delete mode 100644 src/vpn/dnsCleanNetworkSetup.go delete mode 100644 src/vpn/dnsDetect.go delete mode 100644 src/vpn/dnsDetect_darwin.go delete mode 100644 src/vpn/dnsDetect_linux.go delete mode 100644 src/vpn/dnsDetect_windows.go delete mode 100644 src/vpn/dnsIsAlive.go delete mode 100644 src/vpn/handler.go delete mode 100644 src/vpn/handler_stopVpn.go delete mode 100644 src/vpn/isVpnTunnelAlive.go delete mode 100644 src/vpn/public_startVpn.go delete mode 100644 src/vpn/public_statusVpn.go delete mode 100644 src/vpn/reloadVpn.go delete mode 100644 src/vpn/setDns.go delete mode 100644 src/vpn/setDnsNetworksetup.go delete mode 100644 src/vpn/setVpn_darwin.go delete mode 100644 src/vpn/setVpn_linux.go delete mode 100644 src/vpn/setVpn_windows.go delete mode 100644 src/vpn/startVpn.go delete mode 100644 src/vpn/stopVpn.go create mode 100644 src/yamlReader/readYaml.go create mode 100644 src/zeropsRestApiClient/errors.go create mode 100644 src/zeropsRestApiClient/handler.go create mode 100644 src/zeropsRestApiClient/handler_get_projects_by_client.go create mode 100644 src/zeropsRestApiClient/handler_get_service_stacks_by_project.go diff --git a/cmd/.gitignore b/cmd/.gitignore deleted file mode 100644 index 08c98288..00000000 --- a/cmd/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!.gitignore -!main.go diff --git a/cmd/main.go b/cmd/main.go index 2f396aab..8c03e3be 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -3,20 +3,12 @@ package main import ( "os" - "github.com/zeropsio/zcli/src/metaError" - "github.com/zeropsio/zcli/src/cmd" ) -var ( - Token string -) - func main() { - cmd.BuiltinToken = Token err := cmd.ExecuteCmd() if err != nil { - metaError.Print(err) os.Exit(1) } } diff --git a/go.mod b/go.mod index 3305c737..7af8ee56 100644 --- a/go.mod +++ b/go.mod @@ -1,50 +1,47 @@ module github.com/zeropsio/zcli -go 1.18 +go 1.21 + +require github.com/zeropsio/zerops-go v1.0.4 require ( github.com/aws/aws-sdk-go v1.44.77 - github.com/briandowns/spinner v1.18.1 - github.com/ghodss/yaml v1.0.0 - github.com/golang/protobuf v1.5.2 + github.com/charmbracelet/bubbles v0.16.1 + github.com/charmbracelet/bubbletea v0.24.2 + github.com/charmbracelet/lipgloss v0.9.1 + github.com/google/uuid v1.4.0 github.com/gorilla/websocket v1.5.0 - github.com/judwhite/go-svc v1.2.1 - github.com/lxc/lxd v0.0.0-20220922224603-c76bc42c6393 + github.com/mattn/go-isatty v0.0.20 github.com/onsi/gomega v1.10.1 - github.com/peterh/liner v1.2.2 - github.com/satori/go.uuid v1.2.0 + github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.0 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.13.0 - github.com/zeropsio/zerops-go v1.0.4 - golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 - golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 - golang.org/x/text v0.3.7 - golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220504211119-3d4a969bb56b - google.golang.org/grpc v1.49.0 - google.golang.org/grpc/security/advancedtls v0.0.0-20220516211522-d9b952b17060 - google.golang.org/protobuf v1.28.1 + github.com/stretchr/testify v1.8.0 + golang.org/x/text v0.14.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( - cloud.google.com/go/compute v1.6.1 // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/google/go-cmp v0.5.8 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/native v1.0.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.6 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/mdlayher/genetlink v1.2.0 // indirect - github.com/mdlayher/netlink v1.6.0 // indirect - github.com/mdlayher/socket v0.2.3 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.2 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/spf13/afero v1.9.2 // indirect @@ -52,16 +49,12 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.1 // indirect - golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 // indirect - golang.org/x/net v0.0.0-20220921203646-d300de134e69 // indirect - golang.org/x/sync v0.0.0-20220907140024-f12130a52804 // indirect - golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect - golang.zx2c4.com/wireguard v0.0.0-20220407013110-ef5c587f782d // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220921223823-23cae91e6737 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index b697af8a..1f98d9b1 100644 --- a/go.sum +++ b/go.sum @@ -13,35 +13,16 @@ cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bP cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -57,15 +38,17 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aws/aws-sdk-go v1.44.77 h1:m5rTfdv04/swD+vTuS2zn4NEwKX3yEJPMhiVCFDL/mU= github.com/aws/aws-sdk-go v1.44.77/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/briandowns/spinner v1.18.1 h1:yhQmQtM1zsqFsouh09Bk/jCjd50pC3EOGsh28gLVvwY= -github.com/briandowns/spinner v1.18.1/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= +github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= +github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY= +github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg= +github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= +github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 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= @@ -73,11 +56,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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= @@ -87,19 +67,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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= @@ -114,8 +87,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 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= @@ -130,11 +101,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -145,17 +111,12 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -166,27 +127,17 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -199,46 +150,39 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk= -github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/judwhite/go-svc v1.2.1 h1:a7fsJzYUa33sfDJRF2N/WXhA+LonCEEY8BJb1tuS5tA= -github.com/judwhite/go-svc v1.2.1/go.mod h1:mo/P2JNX8C07ywpP9YtO2gnBgnUiFTHqtsZekJrUuTk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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/lxc/lxd v0.0.0-20220922224603-c76bc42c6393 h1:i6HYgbIYKfPUlR7s0owwxJc7b9iljqe5wgzR3FBxBME= -github.com/lxc/lxd v0.0.0-20220922224603-c76bc42c6393/go.mod h1:TYyEqgcI2ybKnbGv7cgNCBFXFRdvPvWHdf5jBKLCnkY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mdlayher/genetlink v1.2.0 h1:4yrIkRV5Wfk1WfpWTcoOlGmsWgQj3OtQN9ZsbrE+XtU= -github.com/mdlayher/genetlink v1.2.0/go.mod h1:ra5LDov2KrUCZJiAtEvXXZBxGMInICMXIwshlJ+qRxQ= -github.com/mdlayher/netlink v1.6.0 h1:rOHX5yl7qnlpiVkFWoqccueppMtXzeziFjWAjLg6sz0= -github.com/mdlayher/netlink v1.6.0/go.mod h1:0o3PlBmGst1xve7wQ7j/hwpNaFaH4qCRyWCdcZk8/vA= -github.com/mdlayher/socket v0.1.1/go.mod h1:mYV5YIZAfHh4dzDVzI8x8tWLWCliuX8Mon5Awbj+qDs= -github.com/mdlayher/socket v0.2.3 h1:XZA2X2TjdOwNoNPVPclRCURoX/hokBY8nkTmRZFEheM= -github.com/mdlayher/socket v0.2.3/go.mod h1:bz12/FozYNH/VbvC3q7TRIK/Y6dH1kCKsXaUeXi/FmY= -github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -251,27 +195,24 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= -github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -289,7 +230,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= @@ -300,7 +240,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zeropsio/zerops-go v1.0.4 h1:FQM1M+/c9GwKezzc6TOvgPl2q3wjem+9JlpWpPQxLgM= github.com/zeropsio/zerops-go v1.0.4/go.mod h1:Nuqf1xWt53IRLyVoXgR4hF4ICc9jlfOfQgnN3ZhJR3E= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -309,8 +248,6 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -318,8 +255,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 h1:a5Yg6ylndHHYJqIPrdq0AhvR6KTvDTAvgBtaidhEevY= -golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -343,7 +278,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/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/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -354,7 +288,6 @@ 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.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/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= @@ -385,21 +318,12 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220921203646-d300de134e69 h1:hUJpGDpnfwdJW8iNypFjmSY0sCBEL+spFTZ2eO+Sfps= -golang.org/x/net v0.0.0-20220921203646-d300de134e69/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= 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= @@ -409,17 +333,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -430,13 +343,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220907140024-f12130a52804 h1:0SH2R3f1b1VmIMG7BXbEZCBUu2dKmHschSmjqGUrW8A= -golang.org/x/sync v0.0.0-20220907140024-f12130a52804/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -450,7 +361,6 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -469,52 +379,29 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/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/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087 h1:tPwmk4vmvVCMdr98VgL4JH+qZxPL8fqlUOHnyOM8N3w= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= 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/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-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= @@ -557,7 +444,6 @@ golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -566,22 +452,12 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.zx2c4.com/wireguard v0.0.0-20220407013110-ef5c587f782d h1:q4JksJ2n0fmbXC0Aj0eOs6E0AcPqnKglxWXWFqGD6x0= -golang.zx2c4.com/wireguard v0.0.0-20220407013110-ef5c587f782d/go.mod h1:bVQfyl2sCM/QIIGHpWbFGfHPuDvqnCNkT6MQLTCjO/U= -golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220504211119-3d4a969bb56b h1:9JncmKXcUwE918my+H6xmjBdhK2jM/UTUNXxhRG1BAk= -golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220504211119-3d4a969bb56b/go.mod h1:yp4gl6zOlnDGOZeWeDfMwQcsdOIQnMdhuPx9mwwWBL4= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -601,30 +477,12 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -649,13 +507,11 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -663,45 +519,7 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220921223823-23cae91e6737 h1:K1zaaMdYBXRyX+cwFnxj7M6zwDyumLQMZ5xqwGvjreQ= -google.golang.org/genproto v0.0.0-20220921223823-23cae91e6737/go.mod h1:2r/26NEF3bFmT3eC3aZreahSal0C3Shl8Gi6vyDYqOQ= 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.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -715,28 +533,9 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/examples v0.0.0-20201112215255-90f1b3ee835b h1:NuxyvVZoDfHZwYW9LD4GJiF5/nhiSyP4/InTrvw9Ibk= -google.golang.org/grpc/examples v0.0.0-20201112215255-90f1b3ee835b/go.mod h1:IBqQ7wSUJ2Ep09a8rMWFsg4fmI2r38zwsq8a0GgxXpM= -google.golang.org/grpc/security/advancedtls v0.0.0-20220516211522-d9b952b17060 h1:D2MHNC3Kys7h1n9uTuAGmAi9mvD2ZV1eFeSxcL4EuH0= -google.golang.org/grpc/security/advancedtls v0.0.0-20220516211522-d9b952b17060/go.mod h1:PoKncN6QA5h/eFRzlCWpHSZnXF2pCtnBzAfeanB8OGQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -747,12 +546,6 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -764,7 +557,6 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/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.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/src/utils/archiveClient/handler.go b/src/archiveClient/handler.go similarity index 100% rename from src/utils/archiveClient/handler.go rename to src/archiveClient/handler.go diff --git a/src/utils/archiveClient/handler_findFilesByRules.go b/src/archiveClient/handler_findFilesByRules.go similarity index 88% rename from src/utils/archiveClient/handler_findFilesByRules.go rename to src/archiveClient/handler_findFilesByRules.go index 70214876..21f206e8 100644 --- a/src/utils/archiveClient/handler_findFilesByRules.go +++ b/src/archiveClient/handler_findFilesByRules.go @@ -16,7 +16,7 @@ func (h *Handler) FindFilesByRules(workingDir string, sources []string) ([]File, return nil, err } - fmt.Printf(i18n.ArchClientWorkingDirectory+"\n", workingDir) + fmt.Printf(i18n.T(i18n.ArchClientWorkingDirectory)+"\n", workingDir) // resulting function returns File from provided path // if file shouldn't be included in the result, File.ArchivePath will be empty @@ -35,7 +35,7 @@ func (h *Handler) FindFilesByRules(workingDir string, sources []string) ([]File, for _, source := range sources { parts := strings.Split(source, "~") if len(parts) > 2 { - return nil, errors.New(i18n.ArchClientMaxOneTilde) + return nil, errors.New(i18n.T(i18n.ArchClientMaxOneTilde)) } if len(parts) == 1 { parts = []string{ @@ -56,9 +56,9 @@ func (h *Handler) FindFilesByRules(workingDir string, sources []string) ([]File, if fileInfo.IsDir() { source = strings.TrimSuffix(source, string(os.PathSeparator)) + string(os.PathSeparator) - fmt.Printf(i18n.ArchClientPackingDirectory+"\n", source) + fmt.Printf(i18n.T(i18n.ArchClientPackingDirectory)+"\n", source) } else { - fmt.Printf(i18n.ArchClientPackingFile+"\n", source) + fmt.Printf(i18n.T(i18n.ArchClientPackingFile)+"\n", source) } trimPath, err := filepath.Abs(filepath.Join(workingDir, parts[0])) diff --git a/src/utils/archiveClient/handler_findFilesByRules_test.go b/src/archiveClient/handler_findFilesByRules_test.go similarity index 100% rename from src/utils/archiveClient/handler_findFilesByRules_test.go rename to src/archiveClient/handler_findFilesByRules_test.go diff --git a/src/utils/archiveClient/handler_findGitFiles.go b/src/archiveClient/handler_findGitFiles.go similarity index 98% rename from src/utils/archiveClient/handler_findGitFiles.go rename to src/archiveClient/handler_findGitFiles.go index 2812b2e3..e18dc0c0 100644 --- a/src/utils/archiveClient/handler_findGitFiles.go +++ b/src/archiveClient/handler_findGitFiles.go @@ -9,7 +9,7 @@ import ( "path/filepath" "strings" - "github.com/zeropsio/zcli/src/utils/cmdRunner" + "github.com/zeropsio/zcli/src/cmdRunner" ) func (h *Handler) FindGitFiles(workingDir string) (res []File, _ error) { diff --git a/src/utils/archiveClient/handler_tarFile.go b/src/archiveClient/handler_tarFile.go similarity index 100% rename from src/utils/archiveClient/handler_tarFile.go rename to src/archiveClient/handler_tarFile.go diff --git a/src/utils/archiveClient/handler_tarFiles.go b/src/archiveClient/handler_tarFiles.go similarity index 100% rename from src/utils/archiveClient/handler_tarFiles.go rename to src/archiveClient/handler_tarFiles.go diff --git a/src/utils/archiveClient/handler_tarFiles_test.go b/src/archiveClient/handler_tarFiles_test.go similarity index 100% rename from src/utils/archiveClient/handler_tarFiles_test.go rename to src/archiveClient/handler_tarFiles_test.go diff --git a/src/utils/archiveClient/handler_utils.go b/src/archiveClient/handler_utils.go similarity index 93% rename from src/utils/archiveClient/handler_utils.go rename to src/archiveClient/handler_utils.go index 04c1c9cd..0c19bcda 100644 --- a/src/utils/archiveClient/handler_utils.go +++ b/src/archiveClient/handler_utils.go @@ -9,7 +9,7 @@ import ( // fixes paths/dirs that may be missing between source root and deployed files (all dirs are needed for valid TAR file) // provided createFile func will receive a valid File.SourcePath and MUST strip workDir to form a valid File.ArchivePath // createdPath is used as a cache to not create paths multiple times for multiple calls of the function -func (h Handler) fixMissingDirPath(files []File, createFile func(filePath string) File, createdPaths map[string]struct{}) []File { +func (h *Handler) fixMissingDirPath(files []File, createFile func(filePath string) File, createdPaths map[string]struct{}) []File { fixedFiles := make([]File, 0, len(files)+50) for _, file := range files { diff --git a/src/utils/archiveClient/test/var/www/dir/file2.1.txt b/src/archiveClient/test/var/www/dir/file2.1.txt similarity index 100% rename from src/utils/archiveClient/test/var/www/dir/file2.1.txt rename to src/archiveClient/test/var/www/dir/file2.1.txt diff --git a/src/utils/archiveClient/test/var/www/dir/file2.2.txt b/src/archiveClient/test/var/www/dir/file2.2.txt similarity index 100% rename from src/utils/archiveClient/test/var/www/dir/file2.2.txt rename to src/archiveClient/test/var/www/dir/file2.2.txt diff --git a/src/utils/archiveClient/test/var/www/dir/subDir/file3.1.txt b/src/archiveClient/test/var/www/dir/subDir/file3.1.txt similarity index 100% rename from src/utils/archiveClient/test/var/www/dir/subDir/file3.1.txt rename to src/archiveClient/test/var/www/dir/subDir/file3.1.txt diff --git a/src/utils/archiveClient/test/var/www/dir/subDir/file3.2.txt b/src/archiveClient/test/var/www/dir/subDir/file3.2.txt similarity index 100% rename from src/utils/archiveClient/test/var/www/dir/subDir/file3.2.txt rename to src/archiveClient/test/var/www/dir/subDir/file3.2.txt diff --git a/src/utils/archiveClient/test/var/www/dir/subDir/file3.3.symlink.txt b/src/archiveClient/test/var/www/dir/subDir/file3.3.symlink.txt similarity index 100% rename from src/utils/archiveClient/test/var/www/dir/subDir/file3.3.symlink.txt rename to src/archiveClient/test/var/www/dir/subDir/file3.3.symlink.txt diff --git a/src/utils/archiveClient/test/var/www/file1.1.txt b/src/archiveClient/test/var/www/file1.1.txt similarity index 100% rename from src/utils/archiveClient/test/var/www/file1.1.txt rename to src/archiveClient/test/var/www/file1.1.txt diff --git a/src/cliAction/bucket/s3/handler.go b/src/cliAction/bucket/s3/handler.go deleted file mode 100644 index c30d8e99..00000000 --- a/src/cliAction/bucket/s3/handler.go +++ /dev/null @@ -1,27 +0,0 @@ -package bucketS3 - -const s3ServerRegion = "us-east-1" - -type Config struct { - S3StorageAddress string -} - -type RunConfig struct { - ServiceStackName string - BucketName string - XAmzAcl string - AccessKeyId string - SecretAccessKey string -} - -type Handler struct { - config Config -} - -func New( - config Config, -) *Handler { - return &Handler{ - config: config, - } -} diff --git a/src/cliAction/bucket/s3/handler_create.go b/src/cliAction/bucket/s3/handler_create.go deleted file mode 100644 index 14bc4545..00000000 --- a/src/cliAction/bucket/s3/handler_create.go +++ /dev/null @@ -1,49 +0,0 @@ -package bucketS3 - -import ( - "context" - "errors" - "fmt" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" -) - -func (h Handler) Create(ctx context.Context, config RunConfig) error { - awsConf := aws.NewConfig(). - WithEndpoint(h.config.S3StorageAddress). - WithRegion(s3ServerRegion). - WithS3ForcePathStyle(true). - WithCredentials( - credentials.NewStaticCredentials(config.AccessKeyId, config.SecretAccessKey, ""), - ) - - sess, err := session.NewSession(awsConf) - if err != nil { - return err - } - - bucketInput := (&s3.CreateBucketInput{}). - SetACL(config.XAmzAcl). - SetBucket(config.BucketName) - - if _, err := s3.New(sess).CreateBucketWithContext(ctx, bucketInput); err != nil { - var s3Err s3.RequestFailure - if errors.As(err, &s3Err) { - if s3Err.Code() == s3.ErrCodeBucketAlreadyExists { - return errors.New(i18n.BucketS3BucketAlreadyExists) - } - return fmt.Errorf(i18n.BucketS3RequestFailed, s3Err) - } - return err - } - - fmt.Println(constants.Success + i18n.BucketCreated + i18n.Success) - - return nil -} diff --git a/src/cliAction/bucket/s3/handler_delete.go b/src/cliAction/bucket/s3/handler_delete.go deleted file mode 100644 index 60a0b5af..00000000 --- a/src/cliAction/bucket/s3/handler_delete.go +++ /dev/null @@ -1,46 +0,0 @@ -package bucketS3 - -import ( - "context" - "errors" - "fmt" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" -) - -func (h Handler) Delete(ctx context.Context, config RunConfig) error { - awsConf := aws.NewConfig(). - WithEndpoint(h.config.S3StorageAddress). - WithRegion(s3ServerRegion). - WithS3ForcePathStyle(true). - WithCredentials( - credentials.NewStaticCredentials(config.AccessKeyId, config.SecretAccessKey, ""), - ) - - sess, err := session.NewSession(awsConf) - if err != nil { - return err - } - - bucketInput := (&s3.DeleteBucketInput{}). - SetBucket(config.BucketName). - SetExpectedBucketOwner(config.AccessKeyId) - - if _, err := s3.New(sess).DeleteBucketWithContext(ctx, bucketInput); err != nil { - var s3Err s3.RequestFailure - if errors.As(err, &s3Err) { - return fmt.Errorf(i18n.BucketS3RequestFailed, s3Err) - } - return err - } - - fmt.Println(constants.Success + i18n.BucketDeleted + i18n.Success) - - return nil -} diff --git a/src/cliAction/bucket/zerops/handler.go b/src/cliAction/bucket/zerops/handler.go deleted file mode 100644 index 0a7a5bfd..00000000 --- a/src/cliAction/bucket/zerops/handler.go +++ /dev/null @@ -1,38 +0,0 @@ -package bucketZerops - -import ( - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -type Config struct { -} - -type RunConfig struct { - ProjectNameOrId string - ServiceStackName string - BucketName string - XAmzAcl string -} - -type Handler struct { - config Config - httpClient *httpClient.Handler - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient - sdkConfig sdkConfig.Config -} - -func New( - config Config, - httpClient *httpClient.Handler, - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, - sdkConfig sdkConfig.Config, -) *Handler { - return &Handler{ - config: config, - httpClient: httpClient, - apiGrpcClient: apiGrpcClient, - sdkConfig: sdkConfig, - } -} diff --git a/src/cliAction/bucket/zerops/handler_create.go b/src/cliAction/bucket/zerops/handler_create.go deleted file mode 100644 index 9007d88c..00000000 --- a/src/cliAction/bucket/zerops/handler_create.go +++ /dev/null @@ -1,71 +0,0 @@ -package bucketZerops - -import ( - "context" - "errors" - "fmt" - "net/http" - "strings" - "time" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/projectService" - "github.com/zeropsio/zerops-go/dto/input/body" - "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types" - "github.com/zeropsio/zerops-go/types/uuid" -) - -func (h Handler) Create(ctx context.Context, config RunConfig) error { - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return err - } - - stack, err := projectService.GetServiceStack(ctx, h.apiGrpcClient, projectId, config.ServiceStackName) - if err != nil { - return err - } - if stack.GetServiceStackTypeInfo().GetServiceStackTypeCategory() != zBusinessZeropsApiProtocol.ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_OBJECT_STORAGE { - return errors.New(i18n.BucketGenericOnlyForObjectStorage) - } - - stackId := stack.GetId() - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(stackId), config.BucketName) - - fmt.Printf(i18n.BucketCreateCreatingZeropsApi, bucketName) - fmt.Println(i18n.BucketGenericBucketNamePrefixed) - - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(h.sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - authorizedSdk := sdk.AuthorizeSdk(zdk, h.sdkConfig.Token) - - bucketBody := body.PostS3Bucket{ - Name: types.NewString(bucketName), - } - if config.XAmzAcl != "" { - bucketBody.XAmzAcl = types.NewStringNull(config.XAmzAcl) - } - - resp, err := authorizedSdk.PostS3Bucket( - ctx, - path.ServiceStackIdNamed{ServiceStackId: uuid.ServiceStackId(stackId)}, - bucketBody, - ) - if err != nil { - return err - } - if _, err := resp.Output(); err != nil { - return err - } - - fmt.Println(constants.Success + i18n.BucketCreated + i18n.Success) - - return nil -} diff --git a/src/cliAction/bucket/zerops/handler_delete.go b/src/cliAction/bucket/zerops/handler_delete.go deleted file mode 100644 index cd8f931a..00000000 --- a/src/cliAction/bucket/zerops/handler_delete.go +++ /dev/null @@ -1,65 +0,0 @@ -package bucketZerops - -import ( - "context" - "errors" - "fmt" - "net/http" - "strings" - "time" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/projectService" - "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types" - "github.com/zeropsio/zerops-go/types/uuid" -) - -func (h Handler) Delete(ctx context.Context, config RunConfig) error { - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return err - } - - stack, err := projectService.GetServiceStack(ctx, h.apiGrpcClient, projectId, config.ServiceStackName) - if err != nil { - return err - } - if stack.GetServiceStackTypeInfo().GetServiceStackTypeCategory() != zBusinessZeropsApiProtocol.ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_OBJECT_STORAGE { - return errors.New(i18n.BucketGenericOnlyForObjectStorage) - } - - stackId := stack.GetId() - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(stackId), config.BucketName) - - fmt.Printf(i18n.BucketDeleteDeletingZeropsApi, bucketName) - fmt.Println(i18n.BucketGenericBucketNamePrefixed) - - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(h.sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - authorizedSdk := sdk.AuthorizeSdk(zdk, h.sdkConfig.Token) - - resp, err := authorizedSdk.DeleteS3( - ctx, - path.S3Bucket{ - ServiceStackId: uuid.ServiceStackId(stackId), - Name: types.NewString(bucketName), - }, - ) - if err != nil { - return err - } - if _, err := resp.Output(); err != nil { - return err - } - - fmt.Println(constants.Success + i18n.BucketDeleted + i18n.Success) - - return nil -} diff --git a/src/cliAction/buildDeploy/handler.go b/src/cliAction/buildDeploy/handler.go deleted file mode 100644 index d9ac7290..00000000 --- a/src/cliAction/buildDeploy/handler.go +++ /dev/null @@ -1,48 +0,0 @@ -package buildDeploy - -import ( - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/archiveClient" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -const zeropsYamlFileName = "zerops.yml" - -type Config struct { -} - -type RunConfig struct { - ProjectNameOrId string - SourceName string - ServiceStackName string - PathsForPacking []string - WorkingDir string - ArchiveFilePath string - VersionName string - ZeropsYamlPath string -} - -type Handler struct { - config Config - httpClient *httpClient.Handler - archClient *archiveClient.Handler - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient - sdkConfig sdkConfig.Config -} - -func New( - config Config, - httpClient *httpClient.Handler, - archClient *archiveClient.Handler, - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, - sdkConfig sdkConfig.Config, -) *Handler { - return &Handler{ - config: config, - httpClient: httpClient, - archClient: archClient, - apiGrpcClient: apiGrpcClient, - sdkConfig: sdkConfig, - } -} diff --git a/src/cliAction/buildDeploy/handler_checkInputValues.go b/src/cliAction/buildDeploy/handler_checkInputValues.go deleted file mode 100644 index 32b97188..00000000 --- a/src/cliAction/buildDeploy/handler_checkInputValues.go +++ /dev/null @@ -1,26 +0,0 @@ -package buildDeploy - -import ( - "context" - "fmt" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/projectService" -) - -func (h *Handler) checkInputValues(ctx context.Context, config RunConfig) (*zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto, error) { - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return nil, err - } - - serviceStack, err := projectService.GetServiceStack(ctx, h.apiGrpcClient, projectId, config.ServiceStackName) - if err != nil { - return nil, err - } - - fmt.Printf(i18n.BuildDeployServiceStatus+"\n", serviceStack.GetStatus().String()) - - return serviceStack, nil -} diff --git a/src/cliAction/buildDeploy/handler_createAppVersion.go b/src/cliAction/buildDeploy/handler_createAppVersion.go deleted file mode 100644 index 8b3eee8d..00000000 --- a/src/cliAction/buildDeploy/handler_createAppVersion.go +++ /dev/null @@ -1,29 +0,0 @@ -package buildDeploy - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func (h *Handler) createAppVersion(ctx context.Context, config RunConfig, serviceStack *zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto) (*zBusinessZeropsApiProtocol.PostAppVersionResponseDto, error) { - appVersionResponse, err := h.apiGrpcClient.PostAppVersion(ctx, &zBusinessZeropsApiProtocol.PostAppVersionRequest{ - ServiceStackId: serviceStack.GetId(), - Name: func() *zBusinessZeropsApiProtocol.StringNull { - if config.VersionName != "" { - return &zBusinessZeropsApiProtocol.StringNull{ - Value: config.VersionName, - Valid: true, - } - } - return &zBusinessZeropsApiProtocol.StringNull{} - }(), - }) - if err := proto.BusinessError(appVersionResponse, err); err != nil { - return nil, err - } - appVersion := appVersionResponse.GetOutput() - - return appVersion, nil -} diff --git a/src/cliAction/buildDeploy/handler_deploy.go b/src/cliAction/buildDeploy/handler_deploy.go deleted file mode 100644 index 7418d2d1..00000000 --- a/src/cliAction/buildDeploy/handler_deploy.go +++ /dev/null @@ -1,178 +0,0 @@ -package buildDeploy - -import ( - "context" - "encoding/base64" - "errors" - "fmt" - "io" - "net/http" - "os" - "path/filepath" - "time" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/processChecker" - "github.com/zeropsio/zerops-go/dto/input/body" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types" - "github.com/zeropsio/zerops-go/types/stringId" -) - -func (h *Handler) Deploy(ctx context.Context, config RunConfig) error { - serviceStack, err := h.checkInputValues(ctx, config) - if err != nil { - return err - } - - configContent, err := h.getValidConfigContent(ctx, config, serviceStack.ServiceStackTypeId, serviceStack.Name) - if err != nil { - return err - } - - fmt.Println(i18n.BuildDeployCreatingPackageStart) - - files, err := h.archClient.FindFilesByRules(config.WorkingDir, config.PathsForPacking) - if err != nil { - return err - } - - reader, writer := io.Pipe() - defer reader.Close() - - tarErrChan := make(chan error, 1) - - go h.archClient.TarFiles(writer, files, tarErrChan) - - r, err := h.savePackage(config, reader) - if err != nil { - return err - } - - appVersion, err := h.createAppVersion(ctx, config, serviceStack) - if err != nil { - return err - } - - if err := h.packageUpload(appVersion, r); err != nil { - // if an error occurred while packing the app, return that error - select { - case err := <-tarErrChan: - return err - default: - return err - } - } - - // wait for packing and saving to finish (should already be done after the package upload has finished) - if tarErr := <-tarErrChan; tarErr != nil { - return tarErr - } - - fmt.Println(i18n.BuildDeployDeployingStart) - - deployResponse, err := h.apiGrpcClient.PutAppVersionDeploy(ctx, &zBusinessZeropsApiProtocol.PutAppVersionDeployRequest{ - Id: appVersion.GetId(), - ConfigContent: configContent, - }) - if err := proto.BusinessError(deployResponse, err); err != nil { - return err - } - - deployProcessId := deployResponse.GetOutput().GetId() - - err = processChecker.CheckProcess(ctx, deployProcessId, h.apiGrpcClient) - if err != nil { - return err - } - - fmt.Println(constants.Success + i18n.BuildDeploySuccess) - - return nil -} - -func (h *Handler) getValidConfigContent( - ctx context.Context, - config RunConfig, - serviceStackTypeId string, - serviceStackName string, -) (*zBusinessZeropsApiProtocol.StringNull, error) { - workingDir, err := filepath.Abs(config.WorkingDir) - if err != nil { - return nil, err - } - - if config.ZeropsYamlPath != "" { - workingDir = filepath.Join(workingDir, config.ZeropsYamlPath) - } - - zeropsYamlPath := filepath.Join(workingDir, zeropsYamlFileName) - - zeropsYamlStat, err := os.Stat(zeropsYamlPath) - if err != nil { - if os.IsNotExist(err) { - if config.ZeropsYamlPath != "" { - return nil, errors.New(i18n.BuildDeployZeropsYamlNotFound) - } - } - return nil, nil - } - - fmt.Printf("%s: %s\n", i18n.BuildDeployZeropsYamlFound, zeropsYamlPath) - - if zeropsYamlStat.Size() == 0 { - return nil, errors.New(i18n.BuildDeployZeropsYamlEmpty) - } - if zeropsYamlStat.Size() > 10*1024 { - return nil, errors.New(i18n.BuildDeployZeropsYamlTooLarge) - } - - yamlContent, err := os.ReadFile(zeropsYamlPath) - if err != nil { - return nil, err - } - - if err = h.validateZeropsYamlContent(ctx, serviceStackTypeId, serviceStackName, yamlContent); err != nil { - return nil, err - } - - return &zBusinessZeropsApiProtocol.StringNull{ - Value: base64.StdEncoding.EncodeToString(yamlContent), - Valid: true, - }, nil -} - -func (h *Handler) validateZeropsYamlContent( - ctx context.Context, - serviceStackTypeId string, - serviceStackName string, - yamlContent []byte, -) error { - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(h.sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - id, err := stringId.NewServiceStackTypeIdFromString(serviceStackTypeId) - if err != nil { - return err - } - - authorizedSdk := sdk.AuthorizeSdk(zdk, h.sdkConfig.Token) - resp, err := authorizedSdk.PostServiceStackZeropsYamlValidation(ctx, body.ZeropsYamlValidation{ - Name: types.NewString(serviceStackName), - ServiceStackTypeId: id, - ZeropsYaml: types.NewText(string(yamlContent)), - }) - if err != nil { - return err - } - if _, err = resp.Output(); err != nil { - return err - } - - return nil -} diff --git a/src/cliAction/buildDeploy/handler_packageUpload.go b/src/cliAction/buildDeploy/handler_packageUpload.go deleted file mode 100644 index 04a0b249..00000000 --- a/src/cliAction/buildDeploy/handler_packageUpload.go +++ /dev/null @@ -1,27 +0,0 @@ -package buildDeploy - -import ( - "errors" - "fmt" - "io" - "net/http" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" -) - -func (h *Handler) packageUpload(appVersion *zBusinessZeropsApiProtocol.PostAppVersionResponseDto, reader io.Reader) error { - fmt.Println(i18n.BuildDeployUploadingPackageStart) - - cephResponse, err := h.httpClient.PutStream(appVersion.GetUploadUrl(), reader, httpClient.ContentType("application/gzip")) - if err != nil { - return err - } - if cephResponse.StatusCode != http.StatusCreated { - return errors.New(i18n.BuildDeployUploadPackageFailed) - } - - fmt.Println(i18n.BuildDeployUploadingPackageDone) - return nil -} diff --git a/src/cliAction/buildDeploy/handler_push.go b/src/cliAction/buildDeploy/handler_push.go deleted file mode 100644 index f34e402f..00000000 --- a/src/cliAction/buildDeploy/handler_push.go +++ /dev/null @@ -1,127 +0,0 @@ -package buildDeploy - -import ( - "context" - "encoding/base64" - "errors" - "fmt" - "io" - "os" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/processChecker" -) - -func (h *Handler) Push(ctx context.Context, config RunConfig) error { - serviceStack, err := h.checkInputValues(ctx, config) - if err != nil { - return err - } - - if config.SourceName == "" { - config.SourceName = serviceStack.GetName() - } - - fmt.Println(i18n.BuildDeployCreatingPackageStart) - - files, err := h.archClient.FindGitFiles(config.WorkingDir) - if err != nil { - return err - } - - buildConfigContent, err := func() ([]byte, error) { - for _, file := range files { - if file.ArchivePath == zeropsYamlFileName { - stat, err := os.Stat(file.SourcePath) - if err != nil { - return nil, err - } - - if stat.Size() == 0 { - return nil, errors.New(i18n.BuildDeployZeropsYamlEmpty) - } - if stat.Size() > 10*1024 { - return nil, errors.New(i18n.BuildDeployZeropsYamlTooLarge) - } - - buildConfigContent, err := os.ReadFile(file.SourcePath) - if err != nil { - return nil, err - } - - return buildConfigContent, nil - } - } - - return nil, errors.New(i18n.BuildDeployZeropsYamlNotFound) - }() - if err != nil { - return err - } - - reader, writer := io.Pipe() - defer reader.Close() - - tarErrChan := make(chan error, 1) - - go h.archClient.TarFiles(writer, files, tarErrChan) - - r, err := h.savePackage(config, reader) - if err != nil { - return err - } - - appVersion, err := h.createAppVersion(ctx, config, serviceStack) - if err != nil { - return err - } - - if err := h.packageUpload(appVersion, r); err != nil { - // if an error occurred while packing the app, return that error - select { - case err := <-tarErrChan: - return err - default: - return err - } - } - - // wait for packing and saving to finish (should already be done after the package upload has finished) - if tarErr := <-tarErrChan; tarErr != nil { - return tarErr - } - - fmt.Println(i18n.BuildDeployCreatingPackageDone) - - if config.ArchiveFilePath != "" { - fmt.Printf(i18n.BuildDeployPackageSavedInto+"\n", config.ArchiveFilePath) - } - - fmt.Println(i18n.BuildDeployDeployingStart) - - deployResponse, err := h.apiGrpcClient.PutAppVersionBuildAndDeploy(ctx, &zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployRequest{ - Id: appVersion.GetId(), - BuildConfigContent: base64.StdEncoding.EncodeToString(buildConfigContent), - Source: &zBusinessZeropsApiProtocol.StringNull{ - Value: config.SourceName, - Valid: true, - }, - }) - if err := proto.BusinessError(deployResponse, err); err != nil { - return err - } - - deployProcessId := deployResponse.GetOutput().GetId() - - err = processChecker.CheckProcess(ctx, deployProcessId, h.apiGrpcClient) - if err != nil { - return err - } - - fmt.Println(constants.Success + i18n.BuildDeploySuccess) - - return nil -} diff --git a/src/cliAction/buildDeploy/handler_savePackage.go b/src/cliAction/buildDeploy/handler_savePackage.go deleted file mode 100644 index 9adefb09..00000000 --- a/src/cliAction/buildDeploy/handler_savePackage.go +++ /dev/null @@ -1,37 +0,0 @@ -package buildDeploy - -import ( - "fmt" - "io" - "os" - "path/filepath" - - "github.com/zeropsio/zcli/src/i18n" -) - -func (h *Handler) savePackage(config RunConfig, reader io.Reader) (io.Reader, error) { - if config.ArchiveFilePath == "" { - return reader, nil - } - - filePath, err := filepath.Abs(config.ArchiveFilePath) - if err != nil { - return reader, err - } - - // check if target file exists - _, err = os.Stat(filePath) - if err != nil && !os.IsNotExist(err) { - return reader, err - } - if err == nil { - return reader, fmt.Errorf(i18n.ArchClientFileAlreadyExists, config.ArchiveFilePath) - } - - file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0660) - if err != nil { - return reader, err - } - - return io.TeeReader(reader, file), nil -} diff --git a/src/cliAction/importProjectService/dataParse.go b/src/cliAction/importProjectService/dataParse.go deleted file mode 100644 index 96b0d821..00000000 --- a/src/cliAction/importProjectService/dataParse.go +++ /dev/null @@ -1,34 +0,0 @@ -package importProjectService - -import ( - "fmt" - - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -// return number of services and process data [](process Id, service name, action name) -func parseServiceData(servicesData []*zBusinessZeropsApiProtocol.ProjectImportServiceStack) (int, [][]string) { - var ( - serviceNames = make([]string, 0, len(servicesData)) - processData [][]string - ) - - for _, service := range servicesData { - serviceErr := service.GetError().GetValue() - if serviceErr != nil { - meta := "" - if len(serviceErr.GetMeta()) > 0 { - meta = fmt.Sprintf("\n%s", string(serviceErr.GetMeta())) - } - fmt.Printf("service %s returned error %s%s", service.GetName(), serviceErr.GetMessage(), meta) - } - - serviceNames = append(serviceNames, service.GetName()) - processes := service.GetProcesses() - - for _, process := range processes { - processData = append(processData, []string{process.GetId(), service.GetName(), process.GetActionName()}) - } - } - return len(serviceNames), processData -} diff --git a/src/cliAction/importProjectService/handler.go b/src/cliAction/importProjectService/handler.go deleted file mode 100644 index 5612a07a..00000000 --- a/src/cliAction/importProjectService/handler.go +++ /dev/null @@ -1,35 +0,0 @@ -package importProjectService - -import ( - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -type Config struct { -} - -type RunConfig struct { - WorkingDir string - ImportYamlPath string - ClientId string - ProjectNameOrId string - ParentCmd constants.ParentCmd -} - -type Handler struct { - config Config - httpClient *httpClient.Handler - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient - sdkConfig sdkConfig.Config -} - -func New(config Config, httpClient *httpClient.Handler, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, sdkConfig sdkConfig.Config) *Handler { - return &Handler{ - config: config, - httpClient: httpClient, - apiGrpcClient: apiGrpcClient, - sdkConfig: sdkConfig, - } -} diff --git a/src/cliAction/importProjectService/handler_getClientId.go b/src/cliAction/importProjectService/handler_getClientId.go deleted file mode 100644 index d5dc94e9..00000000 --- a/src/cliAction/importProjectService/handler_getClientId.go +++ /dev/null @@ -1,16 +0,0 @@ -package importProjectService - -import ( - "context" - - "github.com/zeropsio/zcli/src/utils/projectService" -) - -func (h *Handler) getClientId(ctx context.Context, config RunConfig) (string, error) { - - if len(config.ClientId) > 0 { - return config.ClientId, nil - } - - return projectService.GetClientId(ctx, h.apiGrpcClient) -} diff --git a/src/cliAction/importProjectService/handler_import.go b/src/cliAction/importProjectService/handler_import.go deleted file mode 100644 index b223d26f..00000000 --- a/src/cliAction/importProjectService/handler_import.go +++ /dev/null @@ -1,63 +0,0 @@ -package importProjectService - -import ( - "context" - "fmt" - "strconv" - "sync" - "time" - - "github.com/briandowns/spinner" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/processChecker" -) - -func (h *Handler) Import(ctx context.Context, config RunConfig) error { - - importYamlContent, err := getImportYamlContent(config) - if err != nil { - return err - } - - var servicesData []*zBusinessZeropsApiProtocol.ProjectImportServiceStack - isProjectCmd := config.ParentCmd == constants.Project - - if isProjectCmd { - servicesData, err = h.sendProjectRequest(ctx, config, string(importYamlContent)) - } else { - servicesData, err = h.sendServiceRequest(ctx, config, string(importYamlContent)) - } - if err != nil { - return err - } - - serviceCount, processData := parseServiceData(servicesData) - - fmt.Println(i18n.ServiceStackCount + strconv.Itoa(serviceCount)) - fmt.Println(i18n.QueuedProcesses + strconv.Itoa(len(processData))) - - if isProjectCmd { - fmt.Println(i18n.CoreServices) - } - - var wg sync.WaitGroup - wg.Add(len(processData)) - sp := spinner.New(spinner.CharSets[32], 100*time.Millisecond) - sp.Start() - - for _, processItem := range processData { - go processChecker.CheckMultiple(ctx, processItem, h.apiGrpcClient, &wg, sp) - } - wg.Wait() - - if isProjectCmd { - fmt.Println(constants.Success + i18n.ProjectImported) - } else { - fmt.Println(constants.Success + i18n.ServiceImported) - } - - return nil -} diff --git a/src/cliAction/importProjectService/handler_project.go b/src/cliAction/importProjectService/handler_project.go deleted file mode 100644 index 8bf850d2..00000000 --- a/src/cliAction/importProjectService/handler_project.go +++ /dev/null @@ -1,30 +0,0 @@ -package importProjectService - -import ( - "context" - "fmt" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func (h *Handler) sendProjectRequest(ctx context.Context, config RunConfig, yamlContent string) ([]*zBusinessZeropsApiProtocol.ProjectImportServiceStack, error) { - clientId, err := h.getClientId(ctx, config) - if err != nil { - return nil, err - } - - res, err := h.apiGrpcClient.PostProjectImport(ctx, &zBusinessZeropsApiProtocol.PostProjectImportRequest{ - ClientId: clientId, - Yaml: yamlContent, - }) - if err := proto.BusinessError(res, err); err != nil { - return nil, err - } - - fmt.Println(constants.Success + i18n.ProjectCreated + i18n.Success) - - return res.GetOutput().GetServiceStacks(), nil -} diff --git a/src/cliAction/importProjectService/handler_service.go b/src/cliAction/importProjectService/handler_service.go deleted file mode 100644 index adb0574d..00000000 --- a/src/cliAction/importProjectService/handler_service.go +++ /dev/null @@ -1,26 +0,0 @@ -package importProjectService - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/projectService" -) - -func (h *Handler) sendServiceRequest(ctx context.Context, config RunConfig, yamlContent string) ([]*zBusinessZeropsApiProtocol.ProjectImportServiceStack, error) { - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return nil, err - } - - res, err := h.apiGrpcClient.PostServiceStackImport(ctx, &zBusinessZeropsApiProtocol.PostServiceStackImportRequest{ - ProjectId: projectId, - Yaml: yamlContent, - }) - if err := proto.BusinessError(res, err); err != nil { - return nil, err - } - - return res.GetOutput().GetServiceStacks(), nil -} diff --git a/src/cliAction/importProjectService/yamlContent.go b/src/cliAction/importProjectService/yamlContent.go deleted file mode 100644 index 3f9cde42..00000000 --- a/src/cliAction/importProjectService/yamlContent.go +++ /dev/null @@ -1,57 +0,0 @@ -package importProjectService - -import ( - "errors" - "fmt" - "os" - "path/filepath" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" -) - -func getImportYamlContent(config RunConfig) ([]byte, error) { - fmt.Println(i18n.YamlCheck) - - importYamlPath := config.ImportYamlPath - if !filepath.IsAbs(importYamlPath) { - - workingDir, err := filepath.Abs(config.WorkingDir) - if err != nil { - return nil, err - } - - importYamlPath = filepath.Join(workingDir, importYamlPath) - } - - fileInfo, err := os.Stat(importYamlPath) - if err != nil { - return nil, err - } - - if fileInfo.IsDir() { - return nil, errors.New(i18n.ImportYamlNotFound) - } - - fmt.Printf("%s: %s\n", i18n.ImportYamlFound, importYamlPath) - - if fileInfo.Size() == 0 { - return nil, errors.New(i18n.ImportYamlEmpty) - } - - if fileInfo.Size() > 100*1024 { - return nil, errors.New(i18n.ImportYamlTooLarge) - } - - yamlContent, err := os.ReadFile(importYamlPath) - if err != nil { - return nil, err - } - - if len(yamlContent) == 0 { - return nil, errors.New(i18n.ImportYamlCorrupted) - } - - fmt.Println(constants.Success + i18n.ImportYamlOk) - return yamlContent, nil -} diff --git a/src/cliAction/installDaemon/handler.go b/src/cliAction/installDaemon/handler.go deleted file mode 100644 index ae0d4ea5..00000000 --- a/src/cliAction/installDaemon/handler.go +++ /dev/null @@ -1,26 +0,0 @@ -package installDaemon - -import ( - "github.com/zeropsio/zcli/src/daemonInstaller" -) - -type Config struct { -} - -type RunConfig struct { -} - -type Handler struct { - config Config - daemonInstaller *daemonInstaller.Handler -} - -func New( - config Config, - daemonInstaller *daemonInstaller.Handler, -) *Handler { - return &Handler{ - config: config, - daemonInstaller: daemonInstaller, - } -} diff --git a/src/cliAction/installDaemon/handler_run.go b/src/cliAction/installDaemon/handler_run.go deleted file mode 100644 index 7f3e01b8..00000000 --- a/src/cliAction/installDaemon/handler_run.go +++ /dev/null @@ -1,26 +0,0 @@ -package installDaemon - -import ( - "context" - "errors" - "fmt" - - "github.com/zeropsio/zcli/src/daemonInstaller" - - "github.com/zeropsio/zcli/src/i18n" -) - -func (h *Handler) Run(ctx context.Context, _ RunConfig) error { - - err := h.daemonInstaller.Install() - if errors.Is(err, daemonInstaller.ErrElevatedPrivileges) { - return nil - } - if err != nil { - return err - } - - fmt.Println(i18n.DaemonInstallSuccess) - - return nil -} diff --git a/src/cliAction/login/handler.go b/src/cliAction/login/handler.go deleted file mode 100644 index b5193cf5..00000000 --- a/src/cliAction/login/handler.go +++ /dev/null @@ -1,171 +0,0 @@ -package login - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net/http" - - "github.com/zeropsio/zcli/src/cliStorage" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/daemon" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" -) - -type Config struct { - RestApiAddress string - GrpcApiAddress string -} - -type RunConfig struct { - ZeropsEmail string - ZeropsPassword string - ZeropsToken string -} - -type Handler struct { - config Config - storage *cliStorage.Handler - httpClient *httpClient.Handler - grpcApiClientFactory *zBusinessZeropsApiProtocol.Handler -} - -func New( - config Config, - storage *cliStorage.Handler, - httpClient *httpClient.Handler, - grpcApiClientFactory *zBusinessZeropsApiProtocol.Handler, -) *Handler { - return &Handler{ - config: config, - storage: storage, - httpClient: httpClient, - grpcApiClientFactory: grpcApiClientFactory, - } -} - -func (h *Handler) Run(ctx context.Context, runConfig RunConfig) error { - - if runConfig.ZeropsPassword == "" && - runConfig.ZeropsEmail == "" && - runConfig.ZeropsToken == "" { - return errors.New(i18n.LoginParamsMissing) - } - - var err error - if runConfig.ZeropsToken != "" { - err = h.loginWithToken(ctx, runConfig.ZeropsToken) - } else { - err = h.loginWithPassword(ctx, runConfig.ZeropsEmail, runConfig.ZeropsPassword) - } - if err != nil { - return err - } - - daemonClient, closeFunc, err := daemon.CreateClient(ctx) - if err != nil { - return err - } - defer closeFunc() - - response, err := daemonClient.StopVpn(ctx, &daemon.StopVpnRequest{}) - daemonInstalled, err := proto.DaemonError(err) - if err != nil { - return err - } - - if daemonInstalled && response.GetTunnelState() == daemon.TunnelState_TUNNEL_SET_INACTIVE { - fmt.Println(i18n.LoginVpnClosed) - } - - fmt.Println(i18n.LoginSuccess) - return nil -} - -func (h *Handler) loginWithPassword(_ context.Context, login, password string) error { - loginData, err := json.Marshal(struct { - Email string - Password string - }{ - Email: login, - Password: password, - }) - if err != nil { - return err - } - - loginResponse, err := h.httpClient.Post(h.config.RestApiAddress+"/api/rest/public/auth/login", loginData) - if err != nil { - return err - } - - var loginResponseObject struct { - Auth struct { - AccessToken string - } - } - - if loginResponse.StatusCode < http.StatusBadRequest { - err := json.Unmarshal(loginResponse.Body, &loginResponseObject) - if err != nil { - return err - } - } else { - return parseRestApiError(loginResponse.Body) - } - - cliResponse, err := h.httpClient.Post( - h.config.RestApiAddress+"/api/rest/public/user-token", - nil, - httpClient.BearerAuthorization(loginResponseObject.Auth.AccessToken), - ) - if err != nil { - return err - } - - if cliResponse.StatusCode >= http.StatusBadRequest { - return parseRestApiError(cliResponse.Body) - } - - var tokenResponseObject struct { - Token string `json:"token"` - } - err = json.Unmarshal(cliResponse.Body, &tokenResponseObject) - if err != nil { - return err - } - - h.storage.Update(func(data cliStorage.Data) cliStorage.Data { - data.Token = tokenResponseObject.Token - return data - }) - - return nil -} - -func (h *Handler) loginWithToken(ctx context.Context, token string) error { - grpcApiClient, closeFunc, err := h.grpcApiClientFactory.CreateClient(ctx, h.config.GrpcApiAddress, token) - if err != nil { - return err - } - defer closeFunc() - - resp, err := grpcApiClient.GetUserInfo(ctx, &zBusinessZeropsApiProtocol.GetUserInfoRequest{}) - - if err := proto.BusinessError(resp, err); err != nil { - if proto.IsUnauthenticated(err) { - return i18n.AddHintChangeRegion(err) - } - return err - } - - h.storage.Update(func(data cliStorage.Data) cliStorage.Data { - data.Token = token - return data - }) - - return nil -} diff --git a/src/cliAction/login/handler_parseRestApiError.go b/src/cliAction/login/handler_parseRestApiError.go deleted file mode 100644 index 1e55e0b7..00000000 --- a/src/cliAction/login/handler_parseRestApiError.go +++ /dev/null @@ -1,62 +0,0 @@ -package login - -import ( - "encoding/json" - "errors" - "fmt" - "strings" - - "github.com/zeropsio/zcli/src/i18n" -) - -type failResponse struct { - Error *failResponseError `json:"error"` -} - -func (f failResponse) IsUnauthenticated() bool { - code := f.Error.ErrorCode - return code == userNotFound || code == incorrectUserCredentials -} - -type failResponseError struct { - ErrorCode string `json:"code"` - Message string `json:"message"` - Meta interface{} `json:"meta,omitempty"` -} - -func parseRestApiError(body []byte) error { - var errorResponse failResponse - err := json.Unmarshal(body, &errorResponse) - if err != nil { - return err - } - if errorResponse.Error.ErrorCode == "invalidUserInput" { - var errorList []string - if metaList, ok := errorResponse.Error.Meta.([]interface{}); ok { - for _, meta := range metaList { - if metaItem, ok := meta.(map[string]interface{}); ok { - if parameter, exists := metaItem["parameter"]; exists { - if message, exists := metaItem["message"]; exists { - if p, ok := parameter.(string); ok { - if m, ok := message.(string); ok { - errorList = append(errorList, fmt.Sprintf("'%s': %s", p, m)) - } - } - } - } - } - } - } - - return errors.New(strings.Join(errorList, ", ")) - } else { - err := errors.New(errorResponse.Error.Message) - if errorResponse.IsUnauthenticated() { - return i18n.AddHintChangeRegion(err) - } - return err - } -} - -const userNotFound = "userNotFound" -const incorrectUserCredentials = "incorrectUserCredentials" diff --git a/src/cliAction/removeDaemon/handler.go b/src/cliAction/removeDaemon/handler.go deleted file mode 100644 index 787e5074..00000000 --- a/src/cliAction/removeDaemon/handler.go +++ /dev/null @@ -1,30 +0,0 @@ -package removeDaemon - -import ( - "github.com/zeropsio/zcli/src/cliAction/stopVpn" - "github.com/zeropsio/zcli/src/daemonInstaller" -) - -type Config struct { -} - -type RunConfig struct { -} - -type Handler struct { - config Config - daemonInstaller *daemonInstaller.Handler - stopVpn *stopVpn.Handler -} - -func New( - config Config, - daemonInstaller *daemonInstaller.Handler, - stopVpn *stopVpn.Handler, -) *Handler { - return &Handler{ - config: config, - daemonInstaller: daemonInstaller, - stopVpn: stopVpn, - } -} diff --git a/src/cliAction/removeDaemon/handler_run.go b/src/cliAction/removeDaemon/handler_run.go deleted file mode 100644 index 16046250..00000000 --- a/src/cliAction/removeDaemon/handler_run.go +++ /dev/null @@ -1,42 +0,0 @@ -package removeDaemon - -import ( - "context" - "errors" - "fmt" - - "github.com/zeropsio/zcli/src/daemonInstaller" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/zeropsio/zcli/src/cliAction/stopVpn" - - "github.com/zeropsio/zcli/src/i18n" -) - -func (h *Handler) Run(ctx context.Context, _ RunConfig) error { - - if h.daemonInstaller.IsInstalled() { - err := h.stopVpn.Run(ctx, stopVpn.RunConfig{}) - if err != nil { - if errStatus, ok := status.FromError(err); ok { - if errStatus.Code() == codes.Unavailable { - fmt.Println(i18n.DaemonRemoveStopVpnUnavailable) - } - } - } - } - - err := h.daemonInstaller.Remove() - if errors.Is(err, daemonInstaller.ErrElevatedPrivileges) { - return nil - } - if err != nil { - return err - } - - fmt.Println(i18n.DaemonRemoveSuccess) - - return nil -} diff --git a/src/cliAction/serviceLogs/handler.go b/src/cliAction/serviceLogs/handler.go deleted file mode 100644 index 83f812cd..00000000 --- a/src/cliAction/serviceLogs/handler.go +++ /dev/null @@ -1,41 +0,0 @@ -package serviceLogs - -import ( - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -type Config struct { -} - -type Levels [8][2]string - -type RunConfig struct { - ProjectNameOrId string - ServiceName string - Limit uint32 - MinSeverity string - MsgType string - Format string - FormatTemplate string - Follow bool - Levels Levels -} - -type Handler struct { - config Config - httpClient *httpClient.Handler - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient - sdkConfig sdkConfig.Config - LastMsgId string -} - -func New(config Config, httpClient *httpClient.Handler, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, sdkConfig sdkConfig.Config) *Handler { - return &Handler{ - config: config, - httpClient: httpClient, - apiGrpcClient: apiGrpcClient, - sdkConfig: sdkConfig, - } -} diff --git a/src/cliAction/serviceLogs/handler_getAppVersion.go b/src/cliAction/serviceLogs/handler_getAppVersion.go deleted file mode 100644 index 0d6d232d..00000000 --- a/src/cliAction/serviceLogs/handler_getAppVersion.go +++ /dev/null @@ -1,72 +0,0 @@ -package serviceLogs - -import ( - "context" - "fmt" - "net/http" - "time" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/sdkConfig" - "github.com/zeropsio/zerops-go/dto/input/body" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types" -) - -func (h *Handler) getAppVersionServiceId(ctx context.Context, sdkConfig sdkConfig.Config, clientId string, serviceId string) (string, error) { - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - - authorizedSdk := sdk.AuthorizeSdk(zdk, sdkConfig.Token) - var searchData []body.EsSearchItem - searchData = append(searchData, body.EsSearchItem{ - Name: "clientId", - Operator: "eq", - Value: types.String(clientId), - }, body.EsSearchItem{ - Name: "serviceStackId", - Operator: "eq", - Value: types.String(serviceId), - }, body.EsSearchItem{ - Name: "build.serviceStackId", - Operator: "ne", - Value: "", - }) - - var sortData []body.EsSortItem - sortData = append(sortData, body.EsSortItem{ - Name: "sequence", - Ascending: types.NewBoolNull(false), - }) - - response, err := authorizedSdk.PostAppVersionSearch(ctx, body.EsFilter{ - Search: searchData, - Sort: sortData, - Limit: types.NewIntNull(1), - }) - if err != nil { - return "", err - } - - resOutput, err := response.Output() - if err != nil { - return "", err - } - - if len(resOutput.Items) == 0 { - return "", fmt.Errorf("%s", i18n.LogNoBuildFound) - } - - app := resOutput.Items[0] - status := app.Status - if status == UPLOADING || app.Build == nil { - return "", fmt.Errorf("%s", i18n.LogBuildStatusUploading) - } - - id, _ := app.Build.ServiceStackId.Get() - - return string(id), nil -} diff --git a/src/cliAction/serviceLogs/handler_getContainerId.go b/src/cliAction/serviceLogs/handler_getContainerId.go deleted file mode 100644 index ed682d49..00000000 --- a/src/cliAction/serviceLogs/handler_getContainerId.go +++ /dev/null @@ -1,72 +0,0 @@ -package serviceLogs - -import ( - "context" - "fmt" - "net/http" - "time" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/sdkConfig" - "github.com/zeropsio/zerops-go/dto/input/body" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types" -) - -func (h *Handler) getContainerId(ctx context.Context, sdkConfig sdkConfig.Config, clientId string, serviceId string, containerIndex int) (string, error) { - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - - authorizedSdk := sdk.AuthorizeSdk(zdk, sdkConfig.Token) - - var searchData []body.EsSearchItem - searchData = append(searchData, body.EsSearchItem{ - Name: "clientId", - Operator: "eq", - Value: types.String(clientId), - }, body.EsSearchItem{ - Name: "serviceStackId", - Operator: "eq", - Value: types.String(serviceId), - }) - - var sortData []body.EsSortItem - sortData = append(sortData, body.EsSortItem{ - Name: "number", - Ascending: types.NewBoolNull(true), - }) - - response, err := authorizedSdk.PostContainerSearch(ctx, body.EsFilter{ - Search: searchData, - Sort: sortData, - }) - if err != nil { - return "", err - } - - resOutput, err := response.Output() - if err != nil { // TODO parse meta data - return "", err - } - containers := resOutput.Items - count := len(containers) - - if count == 0 { - return "", fmt.Errorf("%s", i18n.LogNoContainerFound) - } - if count < containerIndex { - verb, plural := "are", "s" - if count < 2 { - verb, plural = "is", "" - } - msg := fmt.Sprintf(i18n.LogTooFewContainers, verb, count, plural) - return "", fmt.Errorf("%s", msg) - } - - containerId := containers[containerIndex-1].Id - - return string(containerId), nil -} diff --git a/src/cliAction/serviceLogs/handler_getNameSourceContainerId.go b/src/cliAction/serviceLogs/handler_getNameSourceContainerId.go deleted file mode 100644 index faf7d0e3..00000000 --- a/src/cliAction/serviceLogs/handler_getNameSourceContainerId.go +++ /dev/null @@ -1,46 +0,0 @@ -package serviceLogs - -import ( - "fmt" - "strconv" - "strings" - - "github.com/zeropsio/zcli/src/i18n" -) - -func (h *Handler) getNameSourceContainerId(config RunConfig) (serviceName, source string, containerId int, err error) { - sn := config.ServiceName - source = RUNTIME - - if !strings.Contains(sn, AT) { - return sn, source, 0, nil - } - split := strings.Split(sn, AT) - if len(split) > 2 { - return "", "", 0, fmt.Errorf("%s", i18n.LogServiceNameInvalid) - } - sn = split[0] - suffix := split[1] - - if strings.Contains(suffix, AT) { - return "", "", 0, fmt.Errorf("%s", i18n.LogServiceNameInvalid) - } - - if suffix == "" { - return sn, source, 0, nil - } - - containerIndex, err := strconv.Atoi(suffix) - if err == nil { - if containerIndex < 1 { - return "", "", 0, fmt.Errorf("%s", i18n.LogSuffixInvalid) - } - return sn, source, containerIndex, nil - } - - if strings.ToUpper(suffix) != BUILD { - return "", "", 0, fmt.Errorf("%s", i18n.LogSuffixInvalid) - } - source = BUILD - return sn, source, 0, nil -} diff --git a/src/cliAction/serviceLogs/handler_getServiceLogUrl.go b/src/cliAction/serviceLogs/handler_getServiceLogUrl.go deleted file mode 100644 index 6d894c75..00000000 --- a/src/cliAction/serviceLogs/handler_getServiceLogUrl.go +++ /dev/null @@ -1,46 +0,0 @@ -package serviceLogs - -import ( - "context" - "fmt" - "github.com/zeropsio/zerops-go/dto/output" - "net/http" - "strings" - "time" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/sdkConfig" - "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types/uuid" -) - -func (h *Handler) getServiceLogResData(ctx context.Context, sdkConfig sdkConfig.Config, projectId string) (string, string, error) { - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - - authorizedSdk := sdk.AuthorizeSdk(zdk, sdkConfig.Token) - - response, err := authorizedSdk.GetProjectLog(ctx, path.ProjectId{Id: uuid.ProjectId(projectId)}) - if err != nil { - return "", "", err - } - - resOutput, err := response.Output() - if err != nil { - return "", "", fmt.Errorf("%s %v", i18n.LogAccessFailed, err) - } - method, url := getLogRequestData(resOutput) - return method, url, nil -} - -func getLogRequestData(resOutput output.ProjectLog) (string, string) { - outputUrl := string(resOutput.Url) - urlData := strings.Split(outputUrl, " ") - method, url := urlData[0], urlData[1] - - return method, url -} diff --git a/src/cliAction/serviceLogs/handler_run.go b/src/cliAction/serviceLogs/handler_run.go deleted file mode 100644 index 2b1f07f3..00000000 --- a/src/cliAction/serviceLogs/handler_run.go +++ /dev/null @@ -1,60 +0,0 @@ -package serviceLogs - -import ( - "context" - "fmt" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/projectService" -) - -func (h *Handler) Run(ctx context.Context, config RunConfig) error { - inputs, err := h.checkInputValues(config) - if err != nil { - return err - } - - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return err - } - - serviceName, source, containerIndex, err := h.getNameSourceContainerId(config) - if err != nil { - return err - } - - service, err := projectService.GetServiceStack(ctx, h.apiGrpcClient, projectId, serviceName) - if err != nil { - return err - } - - serviceTypeCategory := service.GetServiceStackTypeInfo().GetServiceStackTypeCategory().String() - - if serviceTypeCategory != USER { - return fmt.Errorf("%s", i18n.LogRuntimeOnly) - } - serviceId := service.GetId() - containerId := "" - // defined by user, can be 1 or higher - if containerIndex > 0 { - containerId, err = h.getContainerId(ctx, h.sdkConfig, service.Project.ClientId, serviceId, containerIndex) - if err != nil { - return err - } - } - - logServiceId := serviceId - if source == BUILD { - logServiceId, err = h.getAppVersionServiceId(ctx, h.sdkConfig, service.Project.ClientId, serviceId) - if err != nil { - return err - } - } - - if err = h.printLogs(ctx, config, inputs, containerId, logServiceId, projectId); err != nil { - return err - } - - return nil -} diff --git a/src/cliAction/startStopDelete/handler.go b/src/cliAction/startStopDelete/handler.go deleted file mode 100644 index ad65f66d..00000000 --- a/src/cliAction/startStopDelete/handler.go +++ /dev/null @@ -1,50 +0,0 @@ -package startStopDelete - -import ( - "context" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -type Config struct { -} - -type Method func(ctx context.Context, projectId string, serviceId string) (string, error) - -type CmdType struct { - Start string // message for cmd start - Finish string // message for cmd end - Execute Method -} - -type RunConfig struct { - ProjectNameOrId string - ServiceName string - Confirm bool - ParentCmd constants.ParentCmd - CmdData CmdType -} - -func (c *RunConfig) getCmdProps() (string, string, Method) { - cd := c.CmdData - return cd.Start, cd.Finish, cd.Execute -} - -type Handler struct { - config Config - httpClient *httpClient.Handler - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient - sdkConfig sdkConfig.Config -} - -func New(config Config, httpClient *httpClient.Handler, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, sdkConfig sdkConfig.Config) *Handler { - return &Handler{ - config: config, - httpClient: httpClient, - apiGrpcClient: apiGrpcClient, - sdkConfig: sdkConfig, - } -} diff --git a/src/cliAction/startStopDelete/handler_confirm.go b/src/cliAction/startStopDelete/handler_confirm.go deleted file mode 100644 index b65b0341..00000000 --- a/src/cliAction/startStopDelete/handler_confirm.go +++ /dev/null @@ -1,45 +0,0 @@ -package startStopDelete - -import ( - "fmt" - "strings" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" -) - -func askForConfirmation(parent constants.ParentCmd) bool { - if parent == constants.Project { - fmt.Print(i18n.ProjectDeleteConfirm) - } else { - fmt.Print(i18n.ServiceDeleteConfirm) - } - - var response string - - _, err := fmt.Scan(&response) - if err != nil { - fmt.Println(err) - return false - } - - resp := strings.ToLower(response) - if resp == "y" || resp == "yes" { - return true - } else if resp == "n" || resp == "no" { - return false - } else { - return askForConfirmation(parent) - } -} - -func (c RunConfig) getConfirm() string { - if !c.Confirm { - // run confirm dialogue - shouldDelete := askForConfirmation(c.ParentCmd) - if !shouldDelete { - return i18n.DeleteCanceledByUser - } - } - return "" -} diff --git a/src/cliAction/startStopDelete/handler_project.go b/src/cliAction/startStopDelete/handler_project.go deleted file mode 100644 index 1a863f39..00000000 --- a/src/cliAction/startStopDelete/handler_project.go +++ /dev/null @@ -1,42 +0,0 @@ -package startStopDelete - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func (h *Handler) ProjectStart(ctx context.Context, projectId string, _ string) (string, error) { - startProjectResponse, err := h.apiGrpcClient.PutProjectStart(ctx, &zBusinessZeropsApiProtocol.PutProjectStartRequest{ - Id: projectId, - }) - if err := proto.BusinessError(startProjectResponse, err); err != nil { - return "", err - } - - return startProjectResponse.GetOutput().GetId(), nil -} - -func (h *Handler) ProjectStop(ctx context.Context, projectId string, _ string) (string, error) { - stopProjectResponse, err := h.apiGrpcClient.PutProjectStop(ctx, &zBusinessZeropsApiProtocol.PutProjectStopRequest{ - Id: projectId, - }) - if err := proto.BusinessError(stopProjectResponse, err); err != nil { - return "", err - } - - return stopProjectResponse.GetOutput().GetId(), nil -} - -func (h *Handler) ProjectDelete(ctx context.Context, projectId string, _ string) (string, error) { - deleteProjectResponse, err := h.apiGrpcClient.DeleteProject(ctx, &zBusinessZeropsApiProtocol.DeleteProjectRequest{ - Id: projectId, - }) - - if err := proto.BusinessError(deleteProjectResponse, err); err != nil { - return "", err - } - - return deleteProjectResponse.GetOutput().GetId(), nil -} diff --git a/src/cliAction/startStopDelete/handler_runCmd.go b/src/cliAction/startStopDelete/handler_runCmd.go deleted file mode 100644 index 5dd517b7..00000000 --- a/src/cliAction/startStopDelete/handler_runCmd.go +++ /dev/null @@ -1,57 +0,0 @@ -package startStopDelete - -import ( - "context" - "fmt" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/processChecker" - "github.com/zeropsio/zcli/src/utils/projectService" -) - -func (h *Handler) Run(ctx context.Context, config RunConfig) error { - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return err - } - var serviceId string - - if config.ParentCmd == constants.Service { - serviceId, err = projectService.GetServiceId(ctx, h.apiGrpcClient, projectId, config.ServiceName) - if err != nil { - return err - } - } - - err = h.runCmd(ctx, config, projectId, serviceId) - if err != nil { - return err - } - return nil -} - -func (h *Handler) runCmd(ctx context.Context, config RunConfig, projectId string, serviceId string) error { - - startMsg, finishMsg, execute := config.getCmdProps() - msg := config.getConfirm() - if len(msg) > 0 { - fmt.Println(msg) - return nil - } - fmt.Println(startMsg + i18n.ProcessInit) - - processId, err := execute(ctx, projectId, serviceId) - if err != nil { - return err - } - - err = processChecker.CheckProcess(ctx, processId, h.apiGrpcClient) - if err != nil { - return err - } - - fmt.Println(constants.Success + finishMsg + i18n.Success) - - return nil -} diff --git a/src/cliAction/startStopDelete/handler_service.go b/src/cliAction/startStopDelete/handler_service.go deleted file mode 100644 index c17364df..00000000 --- a/src/cliAction/startStopDelete/handler_service.go +++ /dev/null @@ -1,41 +0,0 @@ -package startStopDelete - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func (h *Handler) ServiceStart(ctx context.Context, _ string, serviceId string) (string, error) { - startServiceResponse, err := h.apiGrpcClient.PutServiceStackStart(ctx, &zBusinessZeropsApiProtocol.PutServiceStackStartRequest{ - Id: serviceId, - }) - if err := proto.BusinessError(startServiceResponse, err); err != nil { - return "", err - } - - return startServiceResponse.GetOutput().GetId(), nil -} - -func (h *Handler) ServiceStop(ctx context.Context, _ string, serviceId string) (string, error) { - stopServiceResponse, err := h.apiGrpcClient.PutServiceStackStop(ctx, &zBusinessZeropsApiProtocol.PutServiceStackStopRequest{ - Id: serviceId, - }) - if err := proto.BusinessError(stopServiceResponse, err); err != nil { - return "", err - } - - return stopServiceResponse.GetOutput().GetId(), nil -} - -func (h *Handler) ServiceDelete(ctx context.Context, _ string, serviceId string) (string, error) { - deleteServiceResponse, err := h.apiGrpcClient.DeleteServiceStack(ctx, &zBusinessZeropsApiProtocol.DeleteServiceStackRequest{ - Id: serviceId, - }) - if err := proto.BusinessError(deleteServiceResponse, err); err != nil { - return "", err - } - - return deleteServiceResponse.GetOutput().GetId(), nil -} diff --git a/src/cliAction/startVpn/handler.go b/src/cliAction/startVpn/handler.go deleted file mode 100644 index 014def2f..00000000 --- a/src/cliAction/startVpn/handler.go +++ /dev/null @@ -1,42 +0,0 @@ -package startVpn - -import ( - "github.com/zeropsio/zcli/src/daemonInstaller" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -type Config struct { - GrpcApiAddress string - VpnAddress string -} - -type RunConfig struct { - ProjectNameOrId string - Token string - Mtu uint32 - CaCertificateUrl string - PreferredPortMin uint32 - PreferredPortMax uint32 -} - -type Handler struct { - config Config - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient - daemonInstaller *daemonInstaller.Handler - sdkConfig sdkConfig.Config -} - -func New( - config Config, - apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, - daemonInstaller *daemonInstaller.Handler, - sdkConfig sdkConfig.Config, -) *Handler { - return &Handler{ - config: config, - apiGrpcClient: apiGrpcClient, - daemonInstaller: daemonInstaller, - sdkConfig: sdkConfig, - } -} diff --git a/src/cliAction/startVpn/handler_run.go b/src/cliAction/startVpn/handler_run.go deleted file mode 100644 index ec326597..00000000 --- a/src/cliAction/startVpn/handler_run.go +++ /dev/null @@ -1,105 +0,0 @@ -package startVpn - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/peterh/liner" - - "github.com/zeropsio/zcli/src/daemonInstaller" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/daemon" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils" - "github.com/zeropsio/zcli/src/utils/projectService" -) - -func (h *Handler) Run(ctx context.Context, config RunConfig) error { - - userInfoResponse, err := h.apiGrpcClient.GetUserInfo(ctx, &zBusinessZeropsApiProtocol.GetUserInfoRequest{}) - if err := proto.BusinessError(userInfoResponse, err); err != nil { - return err - } - userId := userInfoResponse.GetOutput().GetId() - - projectId, err := projectService.GetProjectId(ctx, h.apiGrpcClient, config.ProjectNameOrId, h.sdkConfig) - if err != nil { - return err - } - - err = h.tryStartVpn(ctx, projectId, userId, config) - if err != nil { - return err - } - - return nil -} - -func (h *Handler) tryStartVpn(ctx context.Context, projectId string, userId string, config RunConfig) error { - - zeropsDaemonClient, closeFn, err := daemon.CreateClient(ctx) - if err != nil { - return err - } - defer closeFn() - - response, err := zeropsDaemonClient.StartVpn(ctx, &daemon.StartVpnRequest{ - ApiAddress: h.config.GrpcApiAddress, - VpnAddress: h.config.VpnAddress, - ProjectId: projectId, - Token: config.Token, - Mtu: config.Mtu, - UserId: userId, - CaCertificateUrl: config.CaCertificateUrl, - PreferredPortMin: config.PreferredPortMin, - PreferredPortMax: config.PreferredPortMax, - }) - daemonInstalled, err := proto.DaemonError(err) - if err != nil { - return err - } - if !daemonInstalled { - fmt.Println(i18n.VpnDaemonUnavailable) - - line := liner.NewLiner() - defer line.Close() - line.SetCtrlCAborts(true) - - fmt.Println(i18n.VpnStartInstallDaemonPrompt) - for { - if answer, err := line.Prompt("y/n "); err == nil { - if answer == "n" { - return errors.New(i18n.VpnStartTerminatedByUser) - } else if answer == "y" { - err := h.daemonInstaller.Install() - - if errors.Is(err, daemonInstaller.ErrElevatedPrivileges) { - return nil - } - - if err != nil { - return err - } - fmt.Println(i18n.DaemonInstallSuccess) - - // let's wait for daemon start - time.Sleep(3 * time.Second) - return h.tryStartVpn(ctx, projectId, userId, config) - } else { - fmt.Println(i18n.VpnStartUserIsUnableToWriteYorN) - continue - } - } else if err == liner.ErrPromptAborted { - return errors.New(i18n.VpnStartTerminatedByUser) - } else { - return err - } - } - } - - utils.PrintVpnStatus(response) - return nil -} diff --git a/src/cliAction/statusVpn/handler.go b/src/cliAction/statusVpn/handler.go deleted file mode 100644 index 89988378..00000000 --- a/src/cliAction/statusVpn/handler.go +++ /dev/null @@ -1,51 +0,0 @@ -package statusVpn - -import ( - "context" - "fmt" - - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/daemon" - - "github.com/zeropsio/zcli/src/i18n" - - "github.com/zeropsio/zcli/src/utils" -) - -type Config struct { -} - -type RunConfig struct { -} - -type Handler struct { - config Config - zeropsDaemonClient daemon.ZeropsDaemonProtocolClient -} - -func New( - config Config, - zeropsDaemonClient daemon.ZeropsDaemonProtocolClient, -) *Handler { - return &Handler{ - config: config, - zeropsDaemonClient: zeropsDaemonClient, - } -} - -func (h *Handler) Run(ctx context.Context, _ RunConfig) error { - - response, err := h.zeropsDaemonClient.StatusVpn(ctx, &daemon.StatusVpnRequest{}) - daemonInstalled, err := proto.DaemonError(err) - if err != nil { - return err - } - - if !daemonInstalled { - fmt.Println(i18n.VpnDaemonUnavailable) - return nil - } - - utils.PrintVpnStatus(response) - return nil -} diff --git a/src/cliAction/stopVpn/handler.go b/src/cliAction/stopVpn/handler.go deleted file mode 100644 index 340b4d51..00000000 --- a/src/cliAction/stopVpn/handler.go +++ /dev/null @@ -1,56 +0,0 @@ -package stopVpn - -import ( - "context" - "fmt" - - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/daemon" - - "github.com/zeropsio/zcli/src/i18n" -) - -type Config struct { -} - -type RunConfig struct { -} - -type Handler struct { - config Config - zeropsDaemonClient daemon.ZeropsDaemonProtocolClient -} - -func New( - config Config, - zeropsDaemonClient daemon.ZeropsDaemonProtocolClient, -) *Handler { - return &Handler{ - config: config, - zeropsDaemonClient: zeropsDaemonClient, - } -} - -func (h *Handler) Run(ctx context.Context, _ RunConfig) error { - - response, err := h.zeropsDaemonClient.StopVpn(ctx, &daemon.StopVpnRequest{}) - daemonInstalled, err := proto.DaemonError(err) - if err != nil { - return err - } - - if !daemonInstalled { - fmt.Println(i18n.VpnDaemonUnavailable) - return nil - } - - if response.GetTunnelState() == daemon.TunnelState_TUNNEL_SET_INACTIVE { - fmt.Println(i18n.VpnStopSuccess) - if response.GetAdditionalInfo() != "" { - fmt.Println(i18n.VpnStopAdditionalInfo) - fmt.Println(response.GetAdditionalInfo()) - } - } - - return nil -} diff --git a/src/cliStorage/handler.go b/src/cliStorage/handler.go index 3b1a1b57..cd39b863 100644 --- a/src/cliStorage/handler.go +++ b/src/cliStorage/handler.go @@ -1,13 +1,17 @@ package cliStorage -import "github.com/zeropsio/zcli/src/utils/storage" +import ( + "github.com/zeropsio/zcli/src/region" + "github.com/zeropsio/zcli/src/storage" + "github.com/zeropsio/zerops-go/types/uuid" +) type Handler struct { *storage.Handler[Data] } type Data struct { - ProjectId string - ServerIp string - Token string + Token string + RegionData region.Data + ScopeProjectId uuid.ProjectIdNull } diff --git a/src/cmd/args.go b/src/cmd/args.go deleted file mode 100644 index 86d54bcd..00000000 --- a/src/cmd/args.go +++ /dev/null @@ -1,41 +0,0 @@ -package cmd - -import ( - "fmt" - - "github.com/zeropsio/zcli/src/i18n" - - "github.com/spf13/cobra" -) - -func MinimumNArgs(num int) cobra.PositionalArgs { - return customPositionalArgs(cobra.MinimumNArgs(num)) -} - -func ExactNArgs(num int) cobra.PositionalArgs { - return customPositionalArgs(cobra.ExactArgs(num)) -} - -func customPositionalArgs(fn cobra.PositionalArgs) cobra.PositionalArgs { - return func(cmd *cobra.Command, args []string) error { - err := fn(cmd, args) - if err != nil { - return fmt.Errorf("%w\nUsage: %s", err, buildUsage(cmd)) - } - return nil - } -} - -func buildUsage(cmd *cobra.Command) string { - parent := cmd.Parent() - var parentUsage string - if parent != nil { - parentUsage = buildUsage(parent) - parentUsage += " " - } - return parentUsage + cmd.Use -} - -func helpText(add string) string { - return i18n.DisplayHelp + add -} diff --git a/src/cmd/bucket.go b/src/cmd/bucket.go index fdde1923..e3c17b51 100644 --- a/src/cmd/bucket.go +++ b/src/cmd/bucket.go @@ -3,25 +3,28 @@ package cmd import ( "errors" - "github.com/spf13/cobra" - + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) -func bucketCmd() *cobra.Command { - cmd := &cobra.Command{Use: "bucket", Short: i18n.CmdBucket} - - cmd.AddCommand(bucketZeropsCmd(), bucketS3Cmd()) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd +func bucketCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("bucket"). + Short(i18n.T(i18n.CmdBucket)). + AddChildrenCmd(bucketZeropsCmd()). + AddChildrenCmd(bucketS3Cmd()) } -func getXAmzAcl(cmd *cobra.Command) (string, error) { - xAmzAcl := params.GetString(cmd, "x-amz-acl") +// FIXME - janhajek better place? +const ( + xAmzAclName = "x-amz-acl" +) + +func checkXAmzAcl(xAmzAcl string) error { switch xAmzAcl { case "", "private", "public-read", "public-read-write", "authenticated-read": - return xAmzAcl, nil + return nil } - return "", errors.New(i18n.BucketGenericXAmzAclInvalid) + return errors.New(i18n.T(i18n.BucketGenericXAmzAclInvalid)) } diff --git a/src/cmd/bucketS3.go b/src/cmd/bucketS3.go index 8dbebcce..74550c15 100644 --- a/src/cmd/bucketS3.go +++ b/src/cmd/bucketS3.go @@ -1,74 +1,50 @@ package cmd import ( - "context" "errors" "os" - "github.com/spf13/cobra" - + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/region" ) -func bucketS3Cmd() *cobra.Command { - cmd := &cobra.Command{Use: "s3", Short: i18n.CmdBucketS3} - - cmd.AddCommand(bucketS3CreateCmd(), bucketS3DeleteCmd()) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd -} - -func getRegion(ctx context.Context, cmd *cobra.Command) (region.Data, error) { - retriever, err := createRegionRetriever(ctx) - if err != nil { - return region.Data{}, err - } - - // prefer region from command parameter or env - selectedRegion := params.GetString(cmd, "region") - - // if not provided, try to use the region user is logged to - if selectedRegion == "" { - reg, err := retriever.RetrieveFromFile() - if err != nil { - return region.Data{}, err - } - if reg.Name != "" { - return reg, nil - } - } - - // if no region is found, get a default region - regionURL := params.GetString(cmd, "regionURL") - return retriever.RetrieveFromURL(regionURL, selectedRegion) +func bucketS3Cmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("s3"). + Short(i18n.T(i18n.CmdBucketS3)). + AddChildrenCmd(bucketS3CreateCmd()). + AddChildrenCmd(bucketS3DeleteCmd()) } -func getAccessKeys(cmd *cobra.Command, serviceName string) (string, string, error) { - accessKeyId := params.GetString(cmd, "accessKeyId") - secretAccessKey := params.GetString(cmd, "secretAccessKey") +// FIXME - janhajek better place? +const ( + s3ServerRegion = "us-east-1" + accessKeyIdName = "accessKeyId" + secretAccessKeyName = "secretAccessKey" +) +func getAccessKeys(accessKeyId string, secretAccessKey string, serviceName string) (string, string, error) { // only one of the flags is set if (accessKeyId == "" && secretAccessKey != "") || (accessKeyId != "" && secretAccessKey == "") { - return "", "", errors.New(i18n.BucketS3FlagBothMandatory) + return "", "", errors.New(i18n.T(i18n.BucketS3FlagBothMandatory)) } if accessKeyId == "" && secretAccessKey == "" { - if val, ok := os.LookupEnv(serviceName + "_accessKeyId"); ok { + if val, ok := os.LookupEnv(serviceName + "_" + accessKeyIdName); ok { accessKeyId = val } - if val, ok := os.LookupEnv(serviceName + "_secretAccessKey"); ok { + if val, ok := os.LookupEnv(serviceName + "_" + secretAccessKeyName); ok { secretAccessKey = val } // only one of the env variables was set if (accessKeyId == "" && secretAccessKey != "") || (accessKeyId != "" && secretAccessKey == "") { - return "", "", errors.New(i18n.BucketS3EnvBothMandatory) + return "", "", errors.New(i18n.T(i18n.BucketS3EnvBothMandatory)) } } if accessKeyId == "" || secretAccessKey == "" { - return "", "", errors.New(i18n.BucketS3FlagBothMandatory) + return "", "", errors.New(i18n.T(i18n.BucketS3FlagBothMandatory)) } return accessKeyId, secretAccessKey, nil diff --git a/src/cmd/bucketS3Create.go b/src/cmd/bucketS3Create.go index 0df2a1dd..b8abc0ec 100644 --- a/src/cmd/bucketS3Create.go +++ b/src/cmd/bucketS3Create.go @@ -5,67 +5,78 @@ import ( "fmt" "strings" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/bucket/s3" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) -func bucketS3CreateCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create serviceName bucketName [flags]", - Short: i18n.CmdBucketCreate, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) +func bucketS3CreateCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("create"). + Short(i18n.T(i18n.CmdBucketCreate)). + Long(i18n.T(i18n.CmdBucketCreate)). + ScopeLevel(cmdBuilder.Service). + Arg("bucketName"). + StringFlag(xAmzAclName, "", i18n.T(i18n.BucketGenericXAmzAcl)). + StringFlag(accessKeyIdName, "", i18n.T(i18n.BucketS3AccessKeyId)). + StringFlag(secretAccessKeyName, "", i18n.T(i18n.BucketS3SecretAccessKey)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks - xAmzAcl, err := getXAmzAcl(cmd) + xAmzAcl := cmdData.Params.GetString(xAmzAclName) + err := checkXAmzAcl(xAmzAcl) if err != nil { return err } - accessKeyId, secretAccessKey, err := getAccessKeys(cmd, args[0]) + accessKeyId, secretAccessKey, err := getAccessKeys( + cmdData.Params.GetString(accessKeyIdName), + cmdData.Params.GetString(secretAccessKeyName), + cmdData.Service.Name.String(), + ) if err != nil { return err } - reg, err := getRegion(ctx, cmd) + bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), cmdData.Args["bucketName"][0]) + + uxBlocks.PrintLine(i18n.T(i18n.BucketCreateCreatingDirect, bucketName)) + uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) + + awsConf := aws.NewConfig(). + WithEndpoint(cmdData.CliStorage.Data().RegionData.S3StorageAddress). + WithRegion(s3ServerRegion). + WithS3ForcePathStyle(true). + WithCredentials( + credentials.NewStaticCredentials(accessKeyId, secretAccessKey, ""), + ) + + sess, err := session.NewSession(awsConf) if err != nil { return err } - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), args[1]) + bucketInput := (&s3.CreateBucketInput{}). + SetACL(xAmzAclName). + SetBucket(bucketName) - fmt.Printf(i18n.BucketCreateCreatingDirect, bucketName) - fmt.Println(i18n.BucketGenericBucketNamePrefixed) - - b := bucketS3.New(bucketS3.Config{ - S3StorageAddress: reg.S3StorageAddress, - }) - return b.Create(ctx, bucketS3.RunConfig{ - ServiceStackName: args[0], - BucketName: bucketName, - XAmzAcl: xAmzAcl, - AccessKeyId: accessKeyId, - SecretAccessKey: secretAccessKey, - }) - }, - } - params.RegisterString(cmd, "x-amz-acl", "", i18n.BucketGenericXAmzAcl) - params.RegisterString(cmd, "accessKeyId", "", i18n.BucketS3AccessKeyId) - params.RegisterString(cmd, "secretAccessKey", "", i18n.BucketS3SecretAccessKey) - params.RegisterString(cmd, "region", "", i18n.BucketS3Region) + if _, err := s3.New(sess).CreateBucketWithContext(ctx, bucketInput); err != nil { + var s3Err s3.RequestFailure + if errors.As(err, &s3Err) { + if s3Err.Code() == s3.ErrCodeBucketAlreadyExists { + return errors.New(i18n.T(i18n.BucketS3BucketAlreadyExists)) + } + return errors.Errorf(i18n.T(i18n.BucketS3RequestFailed), s3Err) + } + return err + } - params.RegisterString(cmd, "regionURL", defaultRegionUrl, i18n.RegionUrlFlag) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.BucketCreateHelp)) - cmd.SetHelpFunc(func(command *cobra.Command, strings []string) { - if err := command.Flags().MarkHidden("regionURL"); err != nil { - return - } - command.Parent().HelpFunc()(command, strings) - }) + uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketCreated)) - return cmd + return nil + }) } diff --git a/src/cmd/bucketS3Delete.go b/src/cmd/bucketS3Delete.go index 05a46487..da069cb7 100644 --- a/src/cmd/bucketS3Delete.go +++ b/src/cmd/bucketS3Delete.go @@ -5,61 +5,78 @@ import ( "fmt" "strings" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/bucket/s3" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) -func bucketS3DeleteCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "delete serviceName bucketName [flags]", - Short: i18n.CmdBucketDelete, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) +func bucketS3DeleteCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("delete"). + Short(i18n.T(i18n.CmdBucketDelete)). + ScopeLevel(cmdBuilder.Service). + Arg("bucketName"). + StringFlag(accessKeyIdName, "", i18n.T(i18n.BucketS3AccessKeyId)). + StringFlag(secretAccessKeyName, "", i18n.T(i18n.BucketS3SecretAccessKey)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks - accessKeyId, secretAccessKey, err := getAccessKeys(cmd, args[0]) + accessKeyId, secretAccessKey, err := getAccessKeys( + cmdData.Params.GetString(accessKeyIdName), + cmdData.Params.GetString(secretAccessKeyName), + cmdData.Service.Name.String(), + ) if err != nil { return err } - reg, err := getRegion(ctx, cmd) + bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), cmdData.Args["bucketName"][0]) + + confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) if err != nil { return err } - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), args[1]) + if !confirm { + // FIXME - janhajek message + fmt.Println("you have to confirm it") + return nil + } + + uxBlocks.PrintLine(i18n.T(i18n.BucketDeleteDeletingDirect, bucketName)) + uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) - fmt.Printf(i18n.BucketDeleteDeletingDirect, bucketName) - fmt.Println(i18n.BucketGenericBucketNamePrefixed) + awsConf := aws.NewConfig(). + WithEndpoint(cmdData.CliStorage.Data().RegionData.S3StorageAddress). + WithRegion(s3ServerRegion). + WithS3ForcePathStyle(true). + WithCredentials( + credentials.NewStaticCredentials(accessKeyId, secretAccessKey, ""), + ) - b := bucketS3.New(bucketS3.Config{ - S3StorageAddress: reg.S3StorageAddress, - }) - return b.Delete(ctx, bucketS3.RunConfig{ - ServiceStackName: args[0], - BucketName: bucketName, - AccessKeyId: accessKeyId, - SecretAccessKey: secretAccessKey, - }) - }, - } - params.RegisterString(cmd, "x-amz-acl", "", i18n.BucketGenericXAmzAcl) - params.RegisterString(cmd, "accessKeyId", "", i18n.BucketS3AccessKeyId) - params.RegisterString(cmd, "secretAccessKey", "", i18n.BucketS3SecretAccessKey) - params.RegisterString(cmd, "region", "", i18n.BucketS3Region) + sess, err := session.NewSession(awsConf) + if err != nil { + return err + } + + bucketInput := (&s3.DeleteBucketInput{}). + SetBucket(bucketName). + SetExpectedBucketOwner(accessKeyId) + + if _, err := s3.New(sess).DeleteBucketWithContext(ctx, bucketInput); err != nil { + var s3Err s3.RequestFailure + if errors.As(err, &s3Err) { + return errors.Errorf(i18n.T(i18n.BucketS3RequestFailed), s3Err) + } + return err + } - params.RegisterString(cmd, "regionURL", defaultRegionUrl, i18n.RegionUrlFlag) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.BucketDeleteHelp)) - cmd.SetHelpFunc(func(command *cobra.Command, strings []string) { - if err := command.Flags().MarkHidden("regionURL"); err != nil { - return - } - command.Parent().HelpFunc()(command, strings) - }) + uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketDeleted)) - return cmd + return nil + }) } diff --git a/src/cmd/bucketZerops.go b/src/cmd/bucketZerops.go index d4661d5c..de49f9e0 100644 --- a/src/cmd/bucketZerops.go +++ b/src/cmd/bucketZerops.go @@ -1,15 +1,14 @@ package cmd import ( - "github.com/spf13/cobra" - + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) -func bucketZeropsCmd() *cobra.Command { - cmd := &cobra.Command{Use: "zerops", Short: i18n.CmdBucketZerops} - - cmd.AddCommand(bucketZeropsCreateCmd(), bucketZeropsDeleteCmd()) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd +func bucketZeropsCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("zerops"). + Short(i18n.T(i18n.CmdBucketZerops)). + AddChildrenCmd(bucketZeropsCreateCmd()). + AddChildrenCmd(bucketZeropsDeleteCmd()) } diff --git a/src/cmd/bucketZeropsCreate.go b/src/cmd/bucketZeropsCreate.go index 81acbf1d..7c79c31c 100644 --- a/src/cmd/bucketZeropsCreate.go +++ b/src/cmd/bucketZeropsCreate.go @@ -2,80 +2,65 @@ package cmd import ( "context" - "time" + "fmt" + "strings" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/bucket/zerops" + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" ) -func bucketZeropsCreateCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create projectNameOrId serviceName bucketName [flags]", - Short: i18n.CmdBucketCreate, - Args: ExactNArgs(3), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) +func bucketZeropsCreateCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("create"). + Short(i18n.T(i18n.CmdBucketCreate)). + ScopeLevel(cmdBuilder.Service). + Arg("bucketName"). + StringFlag(xAmzAclName, "", i18n.T(i18n.BucketGenericXAmzAcl)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks - xAmzAcl, err := getXAmzAcl(cmd) + xAmzAcl := cmdData.Params.GetString(xAmzAclName) + err := checkXAmzAcl(xAmzAcl) if err != nil { return err } - storage, err := createCliStorage() - if err != nil { - return err + if cmdData.Service.ServiceTypeCategory != enum.ServiceStackTypeCategoryEnumObjectStorage { + return errors.New(i18n.T(i18n.BucketGenericOnlyForObjectStorage)) } - token, err := getToken(storage) - if err != nil { - return err - } + serviceId := cmdData.Service.ID + bucketName := fmt.Sprintf("%s.%s", strings.ToLower(serviceId.Native()), cmdData.Args["bucketName"][0]) - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } + uxBlocks.PrintLine(i18n.T(i18n.BucketCreateCreatingZeropsApi, bucketName)) + uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) - reg, err := region.RetrieveFromFile() - if err != nil { - return err + bucketBody := body.PostS3Bucket{ + Name: types.NewString(bucketName), + } + if xAmzAcl != "" { + bucketBody.XAmzAcl = types.NewStringNull(xAmzAcl) } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + resp, err := cmdData.RestApiClient.PostS3Bucket( ctx, - reg.GrpcApiAddress, - token, + path.ServiceStackIdNamed{ServiceStackId: serviceId}, + bucketBody, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) + if _, err := resp.Output(); err != nil { + return err + } - b := bucketZerops.New(bucketZerops.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - return b.Create(ctx, bucketZerops.RunConfig{ - ProjectNameOrId: args[0], - ServiceStackName: args[1], - BucketName: args[2], - XAmzAcl: xAmzAcl, - }) - }, - } - params.RegisterString(cmd, "x-amz-acl", "", i18n.BucketGenericXAmzAcl) + uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketCreated)) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.BucketCreateHelp)) - return cmd + return nil + }) } diff --git a/src/cmd/bucketZeropsDelete.go b/src/cmd/bucketZeropsDelete.go index c53c7ee7..c4912f75 100644 --- a/src/cmd/bucketZeropsDelete.go +++ b/src/cmd/bucketZeropsDelete.go @@ -2,73 +2,64 @@ package cmd import ( "context" - "time" + "fmt" + "strings" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/bucket/zerops" + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" ) -func bucketZeropsDeleteCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "delete projectNameOrId serviceName bucketName [flags]", - Short: i18n.CmdBucketDelete, - Args: ExactNArgs(3), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) +func bucketZeropsDeleteCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("delete"). + Short(i18n.T(i18n.CmdBucketDelete)). + ScopeLevel(cmdBuilder.Service). + Arg("bucketName"). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks - storage, err := createCliStorage() - if err != nil { - return err + if cmdData.Service.ServiceTypeCategory != enum.ServiceStackTypeCategoryEnumObjectStorage { + return errors.New(i18n.T(i18n.BucketGenericOnlyForObjectStorage)) } - token, err := getToken(storage) - if err != nil { - return err - } + serviceId := cmdData.Service.ID + // FIXME - janhajek duplicate + bucketName := fmt.Sprintf("%s.%s", strings.ToLower(serviceId.Native()), cmdData.Args["bucketName"][0]) - region, err := createRegionRetriever(ctx) + confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) if err != nil { return err } - reg, err := region.RetrieveFromFile() - if err != nil { - return err + if !confirm { + // FIXME - janhajek message + fmt.Println("you have to confirm it") + return nil } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + uxBlocks.PrintLine(i18n.T(i18n.BucketDeleteDeletingZeropsApi, bucketName)) + uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) + + resp, err := cmdData.RestApiClient.DeleteS3( ctx, - reg.GrpcApiAddress, - token, + path.S3Bucket{ + ServiceStackId: serviceId, + Name: types.NewString(bucketName), + }, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) + if _, err := resp.Output(); err != nil { + return err + } - b := bucketZerops.New(bucketZerops.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - return b.Delete(ctx, bucketZerops.RunConfig{ - ProjectNameOrId: args[0], - ServiceStackName: args[1], - BucketName: args[2], - }) - }, - } + uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketDeleted)) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.BucketDeleteHelp)) - return cmd + return nil + }) } diff --git a/src/cmd/daemon.go b/src/cmd/daemon.go deleted file mode 100644 index b3b2b0b0..00000000 --- a/src/cmd/daemon.go +++ /dev/null @@ -1,23 +0,0 @@ -package cmd - -import ( - "github.com/zeropsio/zcli/src/i18n" - - "github.com/spf13/cobra" -) - -func daemonCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "daemon", - Short: i18n.CmdDaemon, - SilenceUsage: true, - } - - cmd.AddCommand(daemonRunCmd()) - cmd.AddCommand(daemonInstallCmd()) - cmd.AddCommand(daemonRemoveCmd()) - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - - return cmd -} diff --git a/src/cmd/daemonInstall.go b/src/cmd/daemonInstall.go deleted file mode 100644 index 768ba3c5..00000000 --- a/src/cmd/daemonInstall.go +++ /dev/null @@ -1,37 +0,0 @@ -package cmd - -import ( - "context" - - "github.com/zeropsio/zcli/src/cliAction/installDaemon" - - "github.com/spf13/cobra" - "github.com/zeropsio/zcli/src/daemonInstaller" - "github.com/zeropsio/zcli/src/i18n" -) - -func daemonInstallCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "install", - Short: i18n.CmdDaemonInstall, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - installer, err := daemonInstaller.New(daemonInstaller.Config{}) - if err != nil { - return err - } - - return installDaemon.New( - installDaemon.Config{}, - installer, - ). - Run(ctx, installDaemon.RunConfig{}) - }, - } - - cmd.PersistentFlags().BoolP("help", "h", false, helpText(i18n.DaemonInstallHelp)) - return cmd -} diff --git a/src/cmd/daemonRemove.go b/src/cmd/daemonRemove.go deleted file mode 100644 index e6713352..00000000 --- a/src/cmd/daemonRemove.go +++ /dev/null @@ -1,53 +0,0 @@ -package cmd - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/daemon" - - "github.com/zeropsio/zcli/src/cliAction/removeDaemon" - "github.com/zeropsio/zcli/src/cliAction/stopVpn" - "github.com/zeropsio/zcli/src/daemonInstaller" - - "github.com/zeropsio/zcli/src/i18n" - - "github.com/spf13/cobra" -) - -func daemonRemoveCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "remove", - Short: i18n.CmdDaemonRemove, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - daemonClient, daemonCloseFunc, err := daemon.CreateClient(ctx) - if err != nil { - return err - } - defer daemonCloseFunc() - - installer, err := daemonInstaller.New(daemonInstaller.Config{}) - if err != nil { - return err - } - - stopVpn := stopVpn.New( - stopVpn.Config{}, - daemonClient, - ) - - return removeDaemon.New( - removeDaemon.Config{}, - installer, - stopVpn, - ). - Run(ctx, removeDaemon.RunConfig{}) - }, - } - - cmd.PersistentFlags().BoolP("help", "h", false, helpText(i18n.DaemonRemoveHelp)) - return cmd -} diff --git a/src/cmd/daemonRun.go b/src/cmd/daemonRun.go deleted file mode 100644 index c3ae5596..00000000 --- a/src/cmd/daemonRun.go +++ /dev/null @@ -1,84 +0,0 @@ -package cmd - -import ( - "context" - "sync" - - "github.com/spf13/cobra" - "github.com/zeropsio/zcli/src/i18n" -) - -func daemonRunCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "run", - Short: i18n.CmdDaemonRun, - SilenceUsage: true, - RunE: run, - } - - cmd.PersistentFlags().BoolP("help", "h", false, helpText(i18n.DaemonRunHelp)) - return cmd -} - -func daemonRun(ctx context.Context) error { - cancelCtx, cancel := context.WithCancel(ctx) - regSignals(cancel) - - if err := prepareEnvironment(); err != nil { - return err - } - - logger, err := createLogger() - if err != nil { - return err - } - - storage, err := createDaemonStorage() - if err != nil { - return err - } - - var wg sync.WaitGroup - - vpnHandler := createVpn(storage, logger) - - if err := vpnHandler.ReloadVpn(cancelCtx); err != nil { - return err - } - - grpcServer, err := createDaemonGrpcServer(vpnHandler) - if err != nil { - return err - } - - wg.Add(1) - go func() { - defer wg.Done() - err := grpcServer.Run(cancelCtx) - if err != nil { - logger.Error(err) - cancel() - } - }() - - vpnProlong := createVpnProlong(storage, logger) - wg.Add(1) - go func() { - defer wg.Done() - err := vpnProlong.Run(cancelCtx) - if err != nil { - logger.Error(err) - cancel() - } - }() - - logger.Info("daemon is running") - - wg.Wait() - - vpnHandler.DnsClean(context.Background()) - - logger.Info("daemon ended") - - return nil -} diff --git a/src/cmd/daemonRun_other.go b/src/cmd/daemonRun_other.go deleted file mode 100644 index a932fc81..00000000 --- a/src/cmd/daemonRun_other.go +++ /dev/null @@ -1,34 +0,0 @@ -//go:build !windows -// +build !windows - -package cmd - -import ( - "os" - "path/filepath" - - "github.com/spf13/cobra" - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonServer" - "github.com/zeropsio/zcli/src/vpn" -) - -func createDaemonGrpcServer(vpn *vpn.Handler) (*daemonServer.Handler, error) { - socketDir := filepath.Dir(constants.DaemonAddress) - err := os.MkdirAll(socketDir, 0755) - if err != nil { - return nil, err - } - - return daemonServer.New(daemonServer.Config{ - Socket: constants.DaemonAddress, - }, vpn), nil -} - -func prepareEnvironment() error { - return nil -} - -func run(cmd *cobra.Command, _ []string) error { - return daemonRun(cmd.Context()) -} diff --git a/src/cmd/daemonRun_windows.go b/src/cmd/daemonRun_windows.go deleted file mode 100644 index 399462c5..00000000 --- a/src/cmd/daemonRun_windows.go +++ /dev/null @@ -1,84 +0,0 @@ -//go:build windows -// +build windows - -package cmd - -import ( - "context" - "errors" - "os" - "strings" - "sync" - - "github.com/judwhite/go-svc" - "github.com/spf13/cobra" - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonServer" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/vpn" -) - -func createDaemonGrpcServer(vpn *vpn.Handler) (*daemonServer.Handler, error) { - return daemonServer.New(daemonServer.Config{ - Address: constants.DaemonAddress, - }, - vpn, - ), nil -} - -func prepareEnvironment() error { - path, found := os.LookupEnv("PATH") - if !found { - return errors.New(i18n.PathNotFound) - } - path = strings.Join(append(strings.Split(path, ";"), constants.WireguardPath), ";") - err := os.Setenv("PATH", path) - if err != nil { - return err - } - - err = os.MkdirAll(constants.DaemonInstallDir, 0777) - return err -} - -type program struct { - cmd *cobra.Command - args []string - err error - - wg sync.WaitGroup - cancel context.CancelFunc - ctx context.Context -} - -func (p *program) Init(environment svc.Environment) error { - return nil -} - -func (p *program) Start() error { - p.wg.Add(1) - go func() { - defer p.wg.Done() - defer p.cancel() - p.err = daemonRun(p.ctx) - }() - return nil -} - -func (p *program) Stop() error { - p.cancel() - p.wg.Wait() - return nil -} - -func run(cmd *cobra.Command, args []string) error { - pr := &program{ - cmd: cmd, - args: args, - } - pr.ctx, pr.cancel = context.WithCancel(cmd.Context()) - if err := svc.Run(pr); err != nil { - return err - } - return pr.err -} diff --git a/src/cmd/deploy.go b/src/cmd/deploy.go deleted file mode 100644 index 472826ee..00000000 --- a/src/cmd/deploy.go +++ /dev/null @@ -1,92 +0,0 @@ -package cmd - -import ( - "context" - "time" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/buildDeploy" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/archiveClient" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -func deployCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "deploy projectNameOrId serviceName pathToFileOrDir [pathToFileOrDir] [flags]", - Short: i18n.CmdDeployDesc, - Long: i18n.CmdDeployDesc + "\n\n" + i18n.DeployDescLong + "\n\n" + i18n.DeployHintPush, - SilenceUsage: true, - Args: MinimumNArgs(3), - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) - if err != nil { - return err - } - - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } - - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } - - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( - ctx, - reg.GrpcApiAddress, - token, - ) - if err != nil { - return err - } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - arch := archiveClient.New(archiveClient.Config{}) - - return buildDeploy.New( - buildDeploy.Config{}, - client, - arch, - apiGrpcClient, - sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}, - ).Deploy(ctx, buildDeploy.RunConfig{ - ArchiveFilePath: params.GetString(cmd, "archiveFilePath"), - WorkingDir: params.GetString(cmd, "workingDir"), - VersionName: params.GetString(cmd, "versionName"), - ZeropsYamlPath: params.GetString(cmd, "zeropsYamlPath"), - ProjectNameOrId: args[0], - ServiceStackName: args[1], - PathsForPacking: args[2:], - }) - }, - } - - params.RegisterString(cmd, "workingDir", "./", i18n.BuildWorkingDir) - params.RegisterString(cmd, "archiveFilePath", "", i18n.BuildArchiveFilePath) - params.RegisterString(cmd, "versionName", "", i18n.BuildVersionName) - params.RegisterString(cmd, "zeropsYamlPath", "", i18n.ZeropsYamlLocation) - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.DeployHelp)) - - return cmd -} diff --git a/src/cmd/di.go b/src/cmd/di.go deleted file mode 100644 index 61aa17fa..00000000 --- a/src/cmd/di.go +++ /dev/null @@ -1,90 +0,0 @@ -package cmd - -import ( - "context" - "errors" - "time" - - "github.com/zeropsio/zcli/src/cliStorage" - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/prolongVpn" - "github.com/zeropsio/zcli/src/region" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/logger" - "github.com/zeropsio/zcli/src/utils/storage" - "github.com/zeropsio/zcli/src/vpn" -) - -func getToken(storage *cliStorage.Handler) (string, error) { - token := BuiltinToken - if storage.Data().Token != "" { - token = storage.Data().Token - } - if token == "" { - return token, errors.New(i18n.UnauthenticatedUser) - } - return token, nil -} - -func createLogger() (*logger.Handler, error) { - return logger.New(logger.Config{ - FilePath: constants.LogFilePath, - }) -} - -func createCliStorage() (*cliStorage.Handler, error) { - filePath, err := constants.CliLoginData() - if err != nil { - return nil, err - } - s, err := storage.New[cliStorage.Data]( - storage.Config{ - FilePath: filePath, - }, - ) - return &cliStorage.Handler{Handler: s}, err -} - -func createDaemonStorage() (*daemonStorage.Handler, error) { - s, err := storage.New[daemonStorage.Data]( - storage.Config{ - FilePath: constants.DaemonStorageFilePath, - }, - ) - return &daemonStorage.Handler{Handler: s}, err -} - -func createRegionRetriever(ctx context.Context) (*region.Handler, error) { - filepath, err := constants.CliRegionData() - if err != nil { - return nil, err - } - s, err := storage.New[region.Data]( - storage.Config{FilePath: filepath}, - ) - return region.New(httpClient.New(ctx, httpClient.Config{HttpTimeout: time.Minute * 5}), s), err -} - -func createVpn( - storage *daemonStorage.Handler, - logger *logger.Handler, -) *vpn.Handler { - return vpn.New( - vpn.Config{ - VpnCheckInterval: time.Second * 3, - VpnCheckRetryCount: 3, - VpnCheckTimeout: time.Second * 60, - }, - logger, - storage, - ) -} - -func createVpnProlong( - storage *daemonStorage.Handler, - logger *logger.Handler, -) *prolongVpn.Handler { - return prolongVpn.New(storage, logger) -} diff --git a/src/cmd/init.go b/src/cmd/init.go deleted file mode 100644 index f4a291ec..00000000 --- a/src/cmd/init.go +++ /dev/null @@ -1,79 +0,0 @@ -package cmd - -import ( - _ "embed" - "errors" - "fmt" - "os" - "regexp" - "text/template" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/i18n" -) - -//go:embed resources/zerops_yml.tmpl -var zeropsYml string - -var initTemplate = template.Must(template.New("zeropsYml").Parse(zeropsYml)) - -type templateData struct { - Name string -} - -var nameRegex = regexp.MustCompile("^[a-z][a-z0-9]{0,39}$") - -func initCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "init [name]", - Short: "initializes zerops project", - Long: `initializes zerops project by creating empty zerops.yml`, - Example: "init app", - Args: cobra.MaximumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - var name string - if len(args) == 1 { - name = args[0] - } - if name == "" { - fmt.Printf(i18n.PromptEnterZeropsServiceName + "\n\n") - promptName, err := prompt[string](i18n.PromptName) - if err != nil { - return err - } - name = promptName - } - if !nameRegex.MatchString(name) { - return errors.New(i18n.PromptInvalidHostname + " See: https://docs.zerops.io/documentation/export-import/project-service-export-import.html#yaml-specification") - } - file, err := os.Create("zerops.yml") - if err != nil { - return err - } - defer file.Close() - return initTemplate.Execute( - file, - templateData{ - Name: name, - }, - ) - }, - SilenceUsage: true, - } - - return cmd -} - -func prompt[T any](prompt string) (T, error) { - fmt.Print("\t" + prompt + ": ") - var t T - n, err := fmt.Scan(&t) - if err != nil { - return t, err - } - if n == 0 { - return t, errors.New(i18n.PromptInvalidInput) - } - return t, nil -} diff --git a/src/cmd/log.go b/src/cmd/log.go deleted file mode 100644 index 65003807..00000000 --- a/src/cmd/log.go +++ /dev/null @@ -1,20 +0,0 @@ -package cmd - -import ( - "github.com/zeropsio/zcli/src/i18n" - - "github.com/spf13/cobra" -) - -func logCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "log", - Short: i18n.CmdLog, - SilenceUsage: true, - } - - cmd.AddCommand(logShowCmd()) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - - return cmd -} diff --git a/src/cmd/login.go b/src/cmd/login.go index 72c01f34..22474f08 100644 --- a/src/cmd/login.go +++ b/src/cmd/login.go @@ -4,97 +4,114 @@ import ( "context" "time" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/login" + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" + "github.com/zeropsio/zcli/src/region" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/errorCode" ) -func loginCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "login token [flags]\n OR\n zcli login username password [flags]", - Short: i18n.CmdLogin, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) (err error) { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) +func loginCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("login"). + Short(i18n.T(i18n.CmdLogin)). + StringFlag("regionUrl", constants.DefaultRegionUrl, i18n.T(i18n.RegionUrlFlag), cmdBuilder.HiddenFlag()). + StringFlag("region", "", i18n.T(i18n.RegionFlag), cmdBuilder.HiddenFlag()). + Arg("token"). + GuestRunFunc(func(ctx context.Context, cmdData *cmdBuilder.GuestCmdData) error { + uxBlocks := cmdData.UxBlocks + + regionRetriever := region.New(httpClient.New(ctx, httpClient.Config{HttpTimeout: time.Minute * 5})) - storage, err := createCliStorage() + regions, err := regionRetriever.RetrieveAllFromURL(cmdData.Params.GetString("regionUrl")) if err != nil { return err } - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Second * 60, - }) - - region, err := createRegionRetriever(ctx) + reg, err := getLoginRegion(ctx, uxBlocks, regions, cmdData.Params.GetString("region")) if err != nil { return err } - regionURL := params.GetString(cmd, "regionURL") - regionName := params.GetString(cmd, "region") + restApiClient := zeropsRestApiClient.NewAuthorizedClient(cmdData.Args["token"][0], reg.RestApiAddress) - reg, err := region.RetrieveFromURLAndSave(regionURL, regionName) + response, err := restApiClient.GetUserInfo(ctx) if err != nil { return err } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) + output, err := response.Output() + if err != nil { + return zeropsRestApiClient.CheckError( + err, + zeropsRestApiClient.CheckErrorCode( + errorCode.NotAuthorized, + errorsx.NewUserError(i18n.T(i18n.LoginIncorrectToken), err), + ), + ) + } - email, password, token := getCredentials(cmd, args) - - return login.New( - login.Config{ - RestApiAddress: reg.RestApiAddress, - GrpcApiAddress: reg.GrpcApiAddress, - }, - storage, - client, - apiClientFactory, - ).Run(ctx, login.RunConfig{ - ZeropsEmail: email, - ZeropsPassword: password, - ZeropsToken: token, + _, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data { + data.Token = cmdData.Args["token"][0] + data.RegionData = reg + return data }) - }, - } + if err != nil { + return err + } - params.RegisterString(cmd, "zeropsLogin", "", i18n.ZeropsLoginFlag) - params.RegisterString(cmd, "zeropsPassword", "", i18n.ZeropsPwdFlag) - params.RegisterString(cmd, "zeropsToken", "", i18n.ZeropsTokenFlag) - params.RegisterString(cmd, "region", "", i18n.RegionFlag) - params.RegisterString(cmd, "regionURL", defaultRegionUrl, i18n.RegionUrlFlag) + uxBlocks.PrintSuccessLine(i18n.T(i18n.LoginSuccess, output.FullName, output.Email)) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.LoginHelp)) - cmd.SetHelpFunc(func(command *cobra.Command, strings []string) { - if err := command.Flags().MarkHidden("regionURL"); err != nil { - return + return nil + }) +} + +func getLoginRegion( + ctx context.Context, + uxBlocks *uxBlock.UxBlocks, + regions []region.Data, + selectedRegion string, +) (region.Data, error) { + if selectedRegion != "" { + for _, reg := range regions { + if reg.Name == selectedRegion { + return reg, nil + } } - command.Parent().HelpFunc()(command, strings) - }) + return region.Data{}, errors.New(i18n.T(i18n.RegionNotFound, selectedRegion)) + } - return cmd -} + for _, reg := range regions { + if reg.IsDefault { + return reg, nil + } + } + + // FIXME - janhajek translation + header := (&uxBlock.TableRow{}).AddStringCells("Name") -func getCredentials(cmd *cobra.Command, args []string) (login, password, token string) { - login = params.GetString(cmd, "zeropsLogin") - password = params.GetString(cmd, "zeropsPassword") - token = params.GetString(cmd, "zeropsToken") - if len(args) == 2 { - login = args[0] - password = args[1] - token = "" + tableBody := &uxBlock.TableBody{} + for _, reg := range regions { + tableBody.AddStringsRow( + reg.Name, + ) } - if len(args) == 1 { - token = args[0] - login = "" - password = "" + + regionIndex, err := uxBlocks.Select( + ctx, + tableBody, + uxBlock.SelectLabel(i18n.T(i18n.ProjectSelectorPrompt)), + uxBlock.SelectTableHeader(header), + ) + if err != nil { + return region.Data{}, err } - return + + return regions[regionIndex[0]], nil } diff --git a/src/cmd/project.go b/src/cmd/project.go index 69ef15dd..99f1e262 100644 --- a/src/cmd/project.go +++ b/src/cmd/project.go @@ -1,14 +1,18 @@ package cmd import ( - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) -func projectCmd() *cobra.Command { - cmd := &cobra.Command{Use: "project", Short: i18n.CmdProject} - - cmd.AddCommand(projectStartCmd(), projectStopCmd(), projectDeleteCmd(), projectImportCmd()) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd +func projectCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("project"). + Short(i18n.T(i18n.CmdProject)). + AddChildrenCmd(projectListCmd()). + AddChildrenCmd(projectStartCmd()). + AddChildrenCmd(projectStopCmd()). + AddChildrenCmd(projectDeleteCmd()). + AddChildrenCmd(projectServiceImportCmd()). + AddChildrenCmd(projectImportCmd()) } diff --git a/src/cmd/projectDelete.go b/src/cmd/projectDelete.go index b6e00237..b60f3812 100644 --- a/src/cmd/projectDelete.go +++ b/src/cmd/projectDelete.go @@ -2,82 +2,65 @@ package cmd import ( "context" - "time" + "fmt" - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zcli/src/cliAction/startStopDelete" - "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" ) -func projectDeleteCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "delete projectNameOrId [flags]", - Short: i18n.CmdProjectDelete, - Args: ExactNArgs(1), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() +func projectDeleteCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("delete"). + Short(i18n.T(i18n.CmdProjectDelete)). + ScopeLevel(cmdBuilder.Project). + Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ProjectDeleteConfirm, cmdData.Project.Name)) if err != nil { return err } - token, err := getToken(storage) - if err != nil { - return err + + if !confirm { + // FIXME - janhajek message + fmt.Println("you have to confirm it") + return nil } - region, err := createRegionRetriever(ctx) + deleteProjectResponse, err := cmdData.RestApiClient.DeleteProject( + ctx, + path.ProjectId{ + Id: cmdData.Project.ID, + }, + ) if err != nil { return err } - reg, err := region.RetrieveFromFile() + responseOutput, err := deleteProjectResponse.Output() if err != nil { return err } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + processId := responseOutput.Id + + err = uxHelpers.ProcessCheckWithSpinner( ctx, - reg.GrpcApiAddress, - token, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: processId, + RunningMessage: i18n.T(i18n.ProjectDeleting), + ErrorMessageMessage: i18n.T(i18n.ProjectDeleting), + SuccessMessage: i18n.T(i18n.ProjectDeleted), + }}, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - handler := startStopDelete.New(startStopDelete.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - - cmdData := startStopDelete.CmdType{ - Start: i18n.ProjectDelete, - Finish: i18n.ProjectDeleted, - Execute: handler.ProjectDelete, - } - - return handler.Run(ctx, startStopDelete.RunConfig{ - ProjectNameOrId: args[0], - Confirm: params.GetBool(cmd, "confirm"), - ParentCmd: constants.Project, - CmdData: cmdData, - }) - }, - } - params.RegisterBool(cmd, "confirm", false, i18n.ConfirmDelete) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.ProjectDeleteHelp)) - return cmd + return nil + }) } diff --git a/src/cmd/projectImport.go b/src/cmd/projectImport.go index ce6eb819..73a40ee6 100644 --- a/src/cmd/projectImport.go +++ b/src/cmd/projectImport.go @@ -2,78 +2,76 @@ package cmd import ( "context" - "time" - "github.com/zeropsio/zcli/src/cliAction/importProjectService" - "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" - - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zcli/src/yamlReader" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/uuid" ) -func projectImportCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "import pathToImportFile [flags]", - Short: i18n.CmdProjectImport, - Long: i18n.ProjectImportLong, - Args: ExactNArgs(1), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) +const projectImportArgName = "importYamlPath" + +func projectImportCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("project-import"). + Short(i18n.T(i18n.CmdProjectImport)). + Long(i18n.T(i18n.CmdProjectImportLong)). + Arg(projectImportArgName). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks - storage, err := createCliStorage() + // FIXME - janhajek client via flag + // FIXME - janhajek interactive selector of clients + + // FIXME - janhajek config + yamlContent, err := yamlReader.ReadContent(uxBlocks, cmdData.Args[projectImportArgName][0], "./") if err != nil { return err } - token, err := getToken(storage) + + importProjectResponse, err := cmdData.RestApiClient.PostProjectImport( + ctx, + body.ProjectImport{ + // FIXME - janhajek client id + ClientId: uuid.ClientId(cmdData.Args[projectImportArgName][0]), + Yaml: types.Text(yamlContent), + }, + ) if err != nil { return err } - region, err := createRegionRetriever(ctx) + responseOutput, err := importProjectResponse.Output() if err != nil { return err } - reg, err := region.RetrieveFromFile() - if err != nil { - return err + var processes []uxHelpers.Process + for _, service := range responseOutput.ServiceStacks { + for _, process := range service.Processes { + processes = append(processes, uxHelpers.Process{ + Id: process.Id, + RunningMessage: service.Name.String() + ": " + process.ActionName.String(), + ErrorMessageMessage: service.Name.String() + ": " + process.ActionName.String(), + SuccessMessage: service.Name.String() + ": " + process.ActionName.String(), + }) + } } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( - ctx, - reg.GrpcApiAddress, - token, - ) + uxBlocks.PrintLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks))) + uxBlocks.PrintLine(i18n.T(i18n.QueuedProcesses, len(processes))) + uxBlocks.PrintLine(i18n.T(i18n.CoreServices)) + + err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, cmdData.RestApiClient, processes) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - return importProjectService.New( - importProjectService.Config{}, client, apiGrpcClient, sdkConfig.Config{}, - ).Import(ctx, importProjectService.RunConfig{ - WorkingDir: constants.WorkingDir, - ImportYamlPath: args[0], - ClientId: params.GetString(cmd, "clientId"), - ParentCmd: constants.Project, - }) - }, - } - params.RegisterString(cmd, "clientId", "", i18n.ClientId) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.ProjectImportHelp)) + uxBlocks.PrintInfoLine(i18n.T(i18n.ProjectImported)) - return cmd + return nil + }) } diff --git a/src/cmd/projectList.go b/src/cmd/projectList.go new file mode 100644 index 00000000..260c02e2 --- /dev/null +++ b/src/cmd/projectList.go @@ -0,0 +1,23 @@ +package cmd + +import ( + "context" + + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" +) + +func projectListCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("list"). + Short(i18n.T(i18n.CmdProjectList)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + err := uxHelpers.PrintProjectList(ctx, cmdData.UxBlocks, cmdData.RestApiClient) + if err != nil { + return err + } + + return nil + }) +} diff --git a/src/cmd/projectServiceImport.go b/src/cmd/projectServiceImport.go new file mode 100644 index 00000000..cb1d7dc2 --- /dev/null +++ b/src/cmd/projectServiceImport.go @@ -0,0 +1,70 @@ +package cmd + +import ( + "context" + + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zcli/src/yamlReader" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/types" +) + +const serviceImportArgName = "importYamlPath" + +func projectServiceImportCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("service-import"). + Short(i18n.T(i18n.CmdServiceImport)). + ScopeLevel(cmdBuilder.Project). + Arg(serviceImportArgName). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks + + yamlContent, err := yamlReader.ReadContent(uxBlocks, cmdData.Args[serviceImportArgName][0], "./") + if err != nil { + return err + } + + importServiceResponse, err := cmdData.RestApiClient.PostServiceStackImport( + ctx, + body.ServiceStackImport{ + ProjectId: cmdData.Project.ID, + Yaml: types.Text(yamlContent), + }, + ) + if err != nil { + return err + } + + responseOutput, err := importServiceResponse.Output() + if err != nil { + return err + } + + var processes []uxHelpers.Process + for _, service := range responseOutput.ServiceStacks { + for _, process := range service.Processes { + processes = append(processes, uxHelpers.Process{ + Id: process.Id, + RunningMessage: service.Name.String() + ": " + process.ActionName.String(), + ErrorMessageMessage: service.Name.String() + ": " + process.ActionName.String(), + SuccessMessage: service.Name.String() + ": " + process.ActionName.String(), + }) + } + } + + uxBlocks.PrintLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks))) + uxBlocks.PrintLine(i18n.T(i18n.QueuedProcesses, len(processes))) + + err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, cmdData.RestApiClient, processes) + if err != nil { + return err + } + + uxBlocks.PrintInfoLine(i18n.T(i18n.ServiceImported)) + + return nil + }) +} diff --git a/src/cmd/projectStart.go b/src/cmd/projectStart.go index d92852aa..546fcdf5 100644 --- a/src/cmd/projectStart.go +++ b/src/cmd/projectStart.go @@ -2,81 +2,52 @@ package cmd import ( "context" - "time" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/startStopDelete" - "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/dto/input/path" ) -func projectStartCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "start projectNameOrId [flags]", - Short: i18n.CmdProjectStart, - Args: ExactNArgs(1), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) +func projectStartCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("start"). + Short(i18n.T(i18n.CmdProjectStart)). + ScopeLevel(cmdBuilder.Project). + Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + startProjectResponse, err := cmdData.RestApiClient.PutProjectStart( + ctx, + path.ProjectId{ + Id: cmdData.Project.ID, + }, + ) if err != nil { return err } - region, err := createRegionRetriever(ctx) + responseOutput, err := startProjectResponse.Output() if err != nil { return err } - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } + processId := responseOutput.Id - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + err = uxHelpers.ProcessCheckWithSpinner( ctx, - reg.GrpcApiAddress, - token, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: processId, + RunningMessage: i18n.T(i18n.ProjectStarting), + ErrorMessageMessage: i18n.T(i18n.ProjectStarting), + SuccessMessage: i18n.T(i18n.ProjectStarted), + }}, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - handler := startStopDelete.New(startStopDelete.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - - cmdData := startStopDelete.CmdType{ - Start: i18n.ProjectStart, - Finish: i18n.ProjectStarted, - Execute: handler.ProjectStart, - } - - return handler.Run(ctx, startStopDelete.RunConfig{ - ProjectNameOrId: args[0], - ParentCmd: constants.Project, - Confirm: true, - CmdData: cmdData, - }) - }, - } - cmd.Flags().BoolP("help", "h", false, helpText(i18n.ProjectStartHelp)) - return cmd + return nil + }) } diff --git a/src/cmd/projectStop.go b/src/cmd/projectStop.go index 841be6f8..086de9ae 100644 --- a/src/cmd/projectStop.go +++ b/src/cmd/projectStop.go @@ -2,81 +2,53 @@ package cmd import ( "context" - "time" - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zcli/src/cliAction/startStopDelete" - "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" ) -func projectStopCmd() *cobra.Command { - cmdStop := &cobra.Command{ - Use: "stop projectNameOrId [flags]", - Short: i18n.CmdProjectStop, - Args: ExactNArgs(1), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) +func projectStopCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("stop"). + Short(i18n.T(i18n.CmdProjectStop)). + ScopeLevel(cmdBuilder.Project). + Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + stopProjectResponse, err := cmdData.RestApiClient.PutProjectStop( + ctx, + path.ProjectId{ + Id: cmdData.Project.ID, + }, + ) if err != nil { return err } - region, err := createRegionRetriever(ctx) + responseOutput, err := stopProjectResponse.Output() if err != nil { return err } - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } + processId := responseOutput.Id - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + err = uxHelpers.ProcessCheckWithSpinner( ctx, - reg.GrpcApiAddress, - token, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: processId, + RunningMessage: i18n.T(i18n.ProjectStopping), + ErrorMessageMessage: i18n.T(i18n.ProjectStopping), + SuccessMessage: i18n.T(i18n.ProjectStopped), + }}, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - handler := startStopDelete.New(startStopDelete.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - - cmdData := startStopDelete.CmdType{ - Start: i18n.ProjectStop, - Finish: i18n.ProjectStopped, - Execute: handler.ProjectStop, - } - - return handler.Run(ctx, startStopDelete.RunConfig{ - ProjectNameOrId: args[0], - ParentCmd: constants.Project, - Confirm: true, - CmdData: cmdData, - }) - }, - } - cmdStop.Flags().BoolP("help", "h", false, helpText(i18n.ProjectStopHelp)) - return cmdStop + return nil + }) } diff --git a/src/cmd/push.go b/src/cmd/push.go deleted file mode 100644 index e01622e0..00000000 --- a/src/cmd/push.go +++ /dev/null @@ -1,102 +0,0 @@ -package cmd - -import ( - "context" - "time" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/buildDeploy" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/archiveClient" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -func pushCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "push projectNameOrId serviceName [flags]", - Short: i18n.CmdPushDesc, - Long: i18n.CmdPushDesc + "\n\n" + i18n.PushDescLong, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) - if err != nil { - return err - } - - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } - - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } - - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( - ctx, - reg.GrpcApiAddress, - token, - ) - if err != nil { - return err - } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - arch := archiveClient.New(archiveClient.Config{ - DeployGitFolder: params.GetBool(cmd, "deployGitFolder"), - }) - - return buildDeploy.New( - buildDeploy.Config{}, - client, - arch, - apiGrpcClient, - sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}, - ).Push(ctx, buildDeploy.RunConfig{ - ArchiveFilePath: params.GetString(cmd, "archiveFilePath"), - WorkingDir: params.GetString(cmd, "workingDir"), - VersionName: params.GetString(cmd, "versionName"), - SourceName: params.GetString(cmd, "source"), - ProjectNameOrId: args[0], - ServiceStackName: args[1], - }) - }, - } - - params.RegisterString(cmd, "workingDir", "./", i18n.BuildWorkingDir) - params.RegisterString(cmd, "archiveFilePath", "", i18n.BuildArchiveFilePath) - params.RegisterString(cmd, "versionName", "", i18n.BuildVersionName) - params.RegisterString(cmd, "source", "", i18n.SourceName) - params.RegisterBool(cmd, "deployGitFolder", false, i18n.UploadGitFolder) - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.PushHelp)) - - cmd.SetHelpFunc(func(command *cobra.Command, strings []string) { - err := command.Flags().MarkHidden("source") - if err != nil { - return - } - command.Parent().HelpFunc()(command, strings) - }) - - return cmd -} diff --git a/src/cmd/regionList.go b/src/cmd/regionList.go deleted file mode 100644 index 6d4135ec..00000000 --- a/src/cmd/regionList.go +++ /dev/null @@ -1,63 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/i18n" -) - -const defaultRegionUrl = "https://api.app.zerops.io/api/rest/public/region/zcli" - -func regionList() *cobra.Command { - cmd := &cobra.Command{ - Use: "region", - Short: i18n.CmdRegion, - } - - listCmd := &cobra.Command{ - Use: "list", - Short: i18n.CmdRegionList, - SilenceUsage: true, - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } - - regionURL := params.GetString(cmd, "regionURL") - regions, err := region.RetrieveAllFromURL(regionURL) - if err != nil { - return err - } - - for _, r := range regions { - fmt.Print(r.Name) - if r.IsDefault { - fmt.Print(" [default]") - } - fmt.Println() - } - return nil - }, - } - params.RegisterString(listCmd, "regionURL", defaultRegionUrl, "zerops region") - listCmd.Flags().BoolP("help", "h", false, helpText(i18n.RegionListHelp)) - - listCmd.SetHelpFunc(func(command *cobra.Command, strings []string) { - if err := command.Flags().MarkHidden("regionURL"); err != nil { - return - } - command.Parent().HelpFunc()(command, strings) - }) - cmd.AddCommand(listCmd) - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd -} diff --git a/src/cmd/resources/zerops_yml.tmpl b/src/cmd/resources/zerops_yml.tmpl deleted file mode 100644 index f39ce69e..00000000 --- a/src/cmd/resources/zerops_yml.tmpl +++ /dev/null @@ -1,28 +0,0 @@ -# Service hostname to which the application will be deployed. -{{ .Name }}: - # The part used for the build phase to produce a final application runtime. - build: - # Which technology should be used as a base one for creating a build container. - base: [ ] - # Which commands should be run to install additional or custom dependencies. - prepare: - # Which commands should be run to build the application. - build: - # Which files or directories of the application build should be stored for the next build. - cache: [] - # Which files and directories should be copied from a build container into a runtime container. - deploy: [] - # The part used to run the application runtime after a successful deployment. - run: - # Which commands should be run to install additional libraries or tools. - prepare: - # Which commands to run after a launch or each restart of a runtime container instance. - init: - # Replacement of template patterns in static files with environment variable values. - envReplace: - # Specification of files / folders to search for delimiters. - target: [ ] - # Specification of one or more delimiters (quote YAML special characters). - delimiter: [ ] - # A command that should start your service. - start: diff --git a/src/cmd/root.go b/src/cmd/root.go index aedb8152..5024c6de 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -1,69 +1,19 @@ package cmd import ( - "context" - "os" - "os/signal" - "syscall" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/support" - paramsPackage "github.com/zeropsio/zcli/src/utils/params" -) - -var ( - params *paramsPackage.Handler + "github.com/zeropsio/zcli/src/cmdBuilder" ) -var BuiltinToken string - func ExecuteCmd() error { - params = paramsPackage.New() - - rootCmd := &cobra.Command{ - Use: "zcli", - CompletionOptions: cobra.CompletionOptions{HiddenDefaultCmd: true}, - SilenceErrors: true, - } - - rootCmd.AddCommand(initCommand()) - rootCmd.AddCommand(deployCmd()) - rootCmd.AddCommand(pushCmd()) - rootCmd.AddCommand(vpnCmd()) - rootCmd.AddCommand(loginCmd()) - rootCmd.AddCommand(logCmd()) - rootCmd.AddCommand(daemonCmd()) - rootCmd.AddCommand(versionCmd()) - rootCmd.AddCommand(regionList()) - rootCmd.AddCommand(projectCmd()) - rootCmd.AddCommand(serviceCmd()) - rootCmd.AddCommand(bucketCmd()) - - rootCmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - - err := params.InitViper() - if err != nil { - return err - } - - ctx := support.Context(context.Background()) - err = rootCmd.ExecuteContext(ctx) - if err != nil { - return err - } - - return nil -} - -func regSignals(contextCancel func()) { - sigs := make(chan os.Signal, 1) + cmdBuilder := cmdBuilder.NewCmdBuilder() - signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + cmdBuilder.AddCommand(loginCmd()) + cmdBuilder.AddCommand(versionCmd()) + cmdBuilder.AddCommand(scopeCmd()) + cmdBuilder.AddCommand(projectCmd()) + cmdBuilder.AddCommand(serviceCmd()) + cmdBuilder.AddCommand(statusCmd()) + cmdBuilder.AddCommand(bucketCmd()) - go func() { - <-sigs - contextCancel() - }() + return cmdBuilder.CreateAndExecuteRootCobraCmd() } diff --git a/src/cmd/scope.go b/src/cmd/scope.go new file mode 100644 index 00000000..feeb75be --- /dev/null +++ b/src/cmd/scope.go @@ -0,0 +1,14 @@ +package cmd + +import ( + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" +) + +func scopeCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("scope"). + Short(i18n.T(i18n.CmdScope)). + AddChildrenCmd(scopeProjectCmd()). + AddChildrenCmd(scopeResetCmd()) +} diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go new file mode 100644 index 00000000..ec645568 --- /dev/null +++ b/src/cmd/scopeProject.go @@ -0,0 +1,65 @@ +package cmd + +import ( + "context" + + "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func scopeProjectCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("project"). + Short(i18n.T(i18n.CmdScopeProject)). + Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + projectId, projectSet := cmdData.CliStorage.Data().ScopeProjectId.Get() + if projectSet { + project, err := repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) + if err != nil { + if !errorsx.IsUserError(err) { + return err + } + cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) + } else { + // FIXME - janhajek message + cmdData.UxBlocks.PrintInfoLine("previously scoped project: " + project.Name.String()) + } + } + + infoText := i18n.SelectedProject + var project *entity.Project + var err error + + if len(cmdData.Args) > 0 { + project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(cmdData.Args["projectId"][0])) + if err != nil { + return err + } + } else { + // interactive selector of a project + project, err = uxHelpers.PrintProjectSelector(ctx, cmdData.UxBlocks, cmdData.RestApiClient) + if err != nil { + return err + } + } + + _, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data { + data.ScopeProjectId = project.ID.ProjectIdNull() + return data + }) + if err != nil { + return err + } + + cmdData.UxBlocks.PrintInfoLine(i18n.T(infoText, project.Name.String())) + + return nil + }) +} diff --git a/src/cmd/scopeReset.go b/src/cmd/scopeReset.go new file mode 100644 index 00000000..a8317bda --- /dev/null +++ b/src/cmd/scopeReset.go @@ -0,0 +1,30 @@ +package cmd + +import ( + "context" + + "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func scopeResetCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("reset"). + Short(i18n.T(i18n.CmdScopeReset)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + _, err := cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data { + data.ScopeProjectId = uuid.ProjectIdNull{} + return data + }) + if err != nil { + return err + } + + // FIXME - janhajek message + cmdData.UxBlocks.PrintInfoLine("scope reset") + + return nil + }) +} diff --git a/src/cmd/service.go b/src/cmd/service.go index ac3e4ae1..6eb65471 100644 --- a/src/cmd/service.go +++ b/src/cmd/service.go @@ -1,14 +1,19 @@ package cmd import ( - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) -func serviceCmd() *cobra.Command { - cmd := &cobra.Command{Use: "service", Short: i18n.CmdService} - - cmd.AddCommand(serviceStartCmd(), serviceStopCmd(), serviceDeleteCmd(), serviceImportCmd(), serviceLogCmd()) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd +func serviceCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("service"). + Short(i18n.T(i18n.CmdService)). + AddChildrenCmd(serviceDeleteCmd()). + AddChildrenCmd(serviceListCmd()). + AddChildrenCmd(serviceLogCmd()). + AddChildrenCmd(serviceStartCmd()). + AddChildrenCmd(serviceStopCmd()). + AddChildrenCmd(servicePushCmd()). + AddChildrenCmd(serviceDeployCmd()) } diff --git a/src/cmd/serviceDelete.go b/src/cmd/serviceDelete.go index 908a96f5..c59c466a 100644 --- a/src/cmd/serviceDelete.go +++ b/src/cmd/serviceDelete.go @@ -2,84 +2,64 @@ package cmd import ( "context" - "time" + "fmt" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/startStopDelete" - "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/dto/input/path" ) -func serviceDeleteCmd() *cobra.Command { - cmdDelete := &cobra.Command{ - Use: "delete projectNameOrId serviceName [flags]", - Short: i18n.CmdServiceDelete, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() +func serviceDeleteCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("delete"). + Short(i18n.T(i18n.CmdServiceDelete)). + ScopeLevel(cmdBuilder.Service). + Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ServiceDeleteConfirm, cmdData.Service.Name)) if err != nil { return err } - token, err := getToken(storage) - if err != nil { - return err + + if !confirm { + // FIXME - janhajek message + fmt.Println("you have to confirm it") + return nil } - region, err := createRegionRetriever(ctx) + deleteServiceResponse, err := cmdData.RestApiClient.DeleteServiceStack( + ctx, + path.ServiceStackId{ + Id: cmdData.Service.ID, + }, + ) if err != nil { return err } - reg, err := region.RetrieveFromFile() + responseOutput, err := deleteServiceResponse.Output() if err != nil { return err } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + processId := responseOutput.Id + + err = uxHelpers.ProcessCheckWithSpinner( ctx, - reg.GrpcApiAddress, - token, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: processId, + RunningMessage: i18n.T(i18n.ServiceDeleting), + ErrorMessageMessage: i18n.T(i18n.ServiceDeleting), + SuccessMessage: i18n.T(i18n.ServiceDeleted), + }}, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - handler := startStopDelete.New(startStopDelete.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - - cmdData := startStopDelete.CmdType{ - Start: i18n.ServiceDelete, - Finish: i18n.ServiceDeleted, - Execute: handler.ServiceDelete, - } - - return handler.Run(ctx, startStopDelete.RunConfig{ - ProjectNameOrId: args[0], - ServiceName: args[1], - Confirm: params.GetBool(cmd, "confirm"), - ParentCmd: constants.Service, - CmdData: cmdData, - }) - }, - } - - params.RegisterBool(cmdDelete, "confirm", false, i18n.ConfirmDelete) - cmdDelete.Flags().BoolP("help", "h", false, helpText(i18n.ServiceDeleteHelp)) - return cmdDelete + return nil + }) } diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go new file mode 100644 index 00000000..434720bb --- /dev/null +++ b/src/cmd/serviceDeploy.go @@ -0,0 +1,209 @@ +package cmd + +import ( + "context" + "encoding/base64" + "io" + "os" + "path/filepath" + "time" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/archiveClient" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/httpClient" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/types" +) + +func serviceDeployCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("deploy"). + Short(i18n.T(i18n.CmdDeployDesc)). + Long(i18n.T(i18n.CmdDeployDesc)+"\n\n"+i18n.T(i18n.DeployDescLong)+"\n\n"+i18n.T(i18n.DeployHintPush)). + ScopeLevel(cmdBuilder.Service). + Arg("pathToFileOrDir", cmdBuilder.ArrayArg()). + StringFlag("workingDir", "./", i18n.T(i18n.BuildWorkingDir)). + StringFlag("archiveFilePath", "", i18n.T(i18n.BuildArchiveFilePath)). + StringFlag("versionName", "", i18n.T(i18n.BuildVersionName)). + StringFlag("zeropsYamlPath", "", i18n.T(i18n.SourceName)). + BoolFlag("deployGitFolder", false, i18n.T(i18n.ZeropsYamlLocation)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks + + arch := archiveClient.New(archiveClient.Config{ + DeployGitFolder: cmdData.Params.GetBool("deployGitFolder"), + }) + + configContent, err := getValidConfigContent( + uxBlocks, + cmdData.Params.GetString("workingDir"), + cmdData.Params.GetString("zeropsYamlPath"), + ) + if err != nil { + return err + } + + err = validateZeropsYamlContent(ctx, cmdData.RestApiClient, cmdData.Service, configContent) + if err != nil { + return err + } + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart)) + + files, err := arch.FindFilesByRules(cmdData.Params.GetString("workingDir"), cmdData.Args["pathToFileOrDir"]) + if err != nil { + return err + } + + reader, writer := io.Pipe() + defer reader.Close() + + tarErrChan := make(chan error, 1) + + go arch.TarFiles(writer, files, tarErrChan) + + r, err := savePackage(cmdData.Params.GetString("archiveFilePath"), reader) + if err != nil { + return err + } + + appVersion, err := createAppVersion( + ctx, + cmdData.RestApiClient, + cmdData.Service, + cmdData.Params.GetString("versionName"), + ) + if err != nil { + return err + } + + // FIXME - janhajek merge with sdk client? + httpClient := httpClient.New(ctx, httpClient.Config{ + HttpTimeout: time.Minute * 15, + }) + + // FIXME - janhajek spinner? + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageStart)) + if err := packageUpload(httpClient, appVersion.UploadUrl.String(), r); err != nil { + // if an error occurred while packing the app, return that error + select { + case err := <-tarErrChan: + return err + default: + return err + } + } + + // wait for packing and saving to finish (should already be done after the package upload has finished) + if tarErr := <-tarErrChan; tarErr != nil { + return tarErr + } + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageDone)) + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployDeployingStart)) + + deployResponse, err := cmdData.RestApiClient.PutAppVersionDeploy( + ctx, + path.AppVersionId{ + Id: appVersion.Id, + }, + body.PutAppVersionDeploy{ + ConfigContent: types.NewMediumTextNull(base64.StdEncoding.EncodeToString(configContent)), + }, + ) + if err != nil { + return err + } + + deployProcess, err := deployResponse.Output() + if err != nil { + return err + } + + err = uxHelpers.ProcessCheckWithSpinner( + ctx, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: deployProcess.Id, + RunningMessage: i18n.T(i18n.PushRunning), + ErrorMessageMessage: i18n.T(i18n.PushRunning), + SuccessMessage: i18n.T(i18n.PushFinished), + }}, + ) + if err != nil { + return err + } + + return nil + }) +} + +func getValidConfigContent(uxBlocks *uxBlock.UxBlocks, workingDir string, zeropsYamlPath string) ([]byte, error) { + workingDir, err := filepath.Abs(workingDir) + if err != nil { + return nil, err + } + + if zeropsYamlPath != "" { + workingDir = filepath.Join(workingDir, zeropsYamlPath) + } + + zeropsYamlPath = filepath.Join(workingDir, ZeropsYamlFileName) + + zeropsYamlStat, err := os.Stat(zeropsYamlPath) + if err != nil { + if os.IsNotExist(err) { + if zeropsYamlPath != "" { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound)) + } + } + return nil, nil + } + + uxBlocks.PrintLine(i18n.T(i18n.BuildDeployZeropsYamlFound, zeropsYamlPath)) + + if zeropsYamlStat.Size() == 0 { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlEmpty)) + } + if zeropsYamlStat.Size() > 10*1024 { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlTooLarge)) + } + + yamlContent, err := os.ReadFile(zeropsYamlPath) + if err != nil { + return nil, err + } + + return yamlContent, nil +} + +func validateZeropsYamlContent( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service *entity.Service, + yamlContent []byte, +) error { + + resp, err := restApiClient.PostServiceStackZeropsYamlValidation(ctx, body.ZeropsYamlValidation{ + Name: service.Name, + ServiceStackTypeId: service.ServiceTypeId, + ZeropsYaml: types.NewText(string(yamlContent)), + }) + if err != nil { + return err + } + if _, err = resp.Output(); err != nil { + return err + } + + return nil +} diff --git a/src/cmd/serviceImport.go b/src/cmd/serviceImport.go deleted file mode 100644 index b42f4f23..00000000 --- a/src/cmd/serviceImport.go +++ /dev/null @@ -1,75 +0,0 @@ -package cmd - -import ( - "context" - "time" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/importProjectService" - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -func serviceImportCmd() *cobra.Command { - cmdImport := &cobra.Command{ - Use: "import projectNameOrId pathToImportFile [flags]", - Short: i18n.CmdServiceImport, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) - if err != nil { - return err - } - - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } - - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } - - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( - ctx, - reg.GrpcApiAddress, - token, - ) - if err != nil { - return err - } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - return importProjectService.New( - importProjectService.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}, - ).Import(ctx, importProjectService.RunConfig{ - WorkingDir: constants.WorkingDir, - ProjectNameOrId: args[0], - ImportYamlPath: args[1], - ParentCmd: constants.Service, - }) - }, - } - cmdImport.Flags().BoolP("help", "h", false, helpText(i18n.ServiceImportHelp)) - return cmdImport -} diff --git a/src/cmd/serviceList.go b/src/cmd/serviceList.go new file mode 100644 index 00000000..fc24ad76 --- /dev/null +++ b/src/cmd/serviceList.go @@ -0,0 +1,25 @@ +package cmd + +import ( + "context" + + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" +) + +func serviceListCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("list"). + Short(i18n.T(i18n.CmdProjectList)). + ScopeLevel(cmdBuilder.Project). + Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + err := uxHelpers.PrintServiceList(ctx, cmdData.UxBlocks, cmdData.RestApiClient, *cmdData.Project) + if err != nil { + return err + } + + return nil + }) +} diff --git a/src/cmd/serviceLog.go b/src/cmd/serviceLog.go index 0db7efb0..49209037 100644 --- a/src/cmd/serviceLog.go +++ b/src/cmd/serviceLog.go @@ -2,90 +2,79 @@ package cmd import ( "context" - "time" - "github.com/spf13/cobra" + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/serviceLogs" + "github.com/zeropsio/zerops-go/types/enum" - "github.com/zeropsio/zcli/src/cliAction/serviceLogs" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" ) -func serviceLogCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "log projectNameOrId serviceName [flags]", - Short: i18n.CmdServiceLog, - Long: i18n.CmdServiceLogLong + i18n.ServiceLogAdditional, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) - if err != nil { - return err - } - - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } - - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } - - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( - ctx, - reg.GrpcApiAddress, - token, +func serviceLogCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("log"). + Short(i18n.T(i18n.CmdServiceLog)). + Long(i18n.T(i18n.CmdServiceLogLong)+i18n.T(i18n.ServiceLogAdditional)). + ScopeLevel(cmdBuilder.Service). + StringFlag("x-amz-acl", "", i18n.T(i18n.BucketGenericXAmzAcl)). + IntFlag("limit", 100, i18n.T(i18n.LogLimitFlag)). + StringFlag("minimumSeverity", "", i18n.T(i18n.LogMinSeverityFlag)). + StringFlag("messageType", "APPLICATION", i18n.T(i18n.LogMsgTypeFlag)). + StringFlag("format", "FULL", i18n.T(i18n.LogFormatFlag)). + StringFlag("formatTemplate", "", i18n.T(i18n.LogFormatTemplateFlag)). + BoolFlag("follow", false, i18n.T(i18n.LogFollowFlag)). + BoolFlag("showBuildLogs", false, i18n.T(i18n.LogShowBuildFlag)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + handler := serviceLogs.New( + serviceLogs.Config{}, + cmdData.RestApiClient, ) - if err != nil { - return err - } - defer closeFunc() - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) + serviceId := cmdData.Service.ID + if cmdData.Params.GetBool("showBuildLogs") { + appVersions, err := repository.GetLatestAppVersionByService(ctx, cmdData.RestApiClient, *cmdData.Service) + if err != nil { + return err + } + if len(appVersions) == 0 { + return errors.New(i18n.T(i18n.LogNoBuildFound)) + } - handler := serviceLogs.New(serviceLogs.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) + app := appVersions[0] + status := app.Status + if status == enum.AppVersionStatusEnumUploading || app.Build == nil { + return errors.New(i18n.T(i18n.LogBuildStatusUploading)) + } - severityLevel := serviceLogs.Levels{{"EMERGENCY", "0"}, {"ALERT", "1"}, {"CRITICAL", "2"}, {"ERROR", "3"}, {"WARNING", "4"}, {"NOTICE", "5"}, {"INFORMATIONAL", "6"}, {"DEBUG", "7"}} + var filled bool + serviceId, filled = app.Build.ServiceStackId.Get() + if !filled { + return errors.New(i18n.T(i18n.LogNoBuildFound)) + } + } return handler.Run(ctx, serviceLogs.RunConfig{ - ProjectNameOrId: args[0], - ServiceName: args[1], - Limit: params.GetUint32("limit"), - MinSeverity: params.GetString(cmd, "minimumSeverity"), - MsgType: params.GetString(cmd, "messageType"), - Format: params.GetString(cmd, "format"), - FormatTemplate: params.GetString(cmd, "formatTemplate"), - Follow: params.GetBool(cmd, "follow"), - Levels: severityLevel, + Project: *cmdData.Project, + ServiceId: serviceId, + Limit: uint32(cmdData.Params.GetInt("limit")), + MinSeverity: cmdData.Params.GetString("minimumSeverity"), + MsgType: cmdData.Params.GetString("messageType"), + Format: cmdData.Params.GetString("format"), + FormatTemplate: cmdData.Params.GetString("formatTemplate"), + Follow: cmdData.Params.GetBool("follow"), + // FIXME - janhajek better place? + Levels: serviceLogs.Levels{ + {"EMERGENCY", "0"}, + {"ALERT", "1"}, + {"CRITICAL", "2"}, + {"ERROR", "3"}, + {"WARNING", "4"}, + {"NOTICE", "5"}, + {"INFORMATIONAL", "6"}, + {"DEBUG", "7"}, + }, }) - }, - } - - params.RegisterUInt32(cmd, "limit", 100, i18n.LogLimitFlag) - params.RegisterString(cmd, "minimumSeverity", "", i18n.LogMinSeverityFlag) - params.RegisterString(cmd, "messageType", "APPLICATION", i18n.LogMsgTypeFlag) - params.RegisterString(cmd, "format", "FULL", i18n.LogFormatFlag) - params.RegisterString(cmd, "formatTemplate", "", i18n.LogFormatTemplateFlag) - params.RegisterBool(cmd, "follow", false, i18n.LogFollowFlag) - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.ServiceLogHelp)) - - return cmd + }) } diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go new file mode 100644 index 00000000..34bfb4da --- /dev/null +++ b/src/cmd/servicePush.go @@ -0,0 +1,248 @@ +package cmd + +import ( + "context" + "encoding/base64" + "io" + "net/http" + "os" + "path/filepath" + "time" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/archiveClient" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/httpClient" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/dto/output" + "github.com/zeropsio/zerops-go/types" +) + +// FIXME - janhajek shared +const ZeropsYamlFileName = "zerops.yaml" + +func servicePushCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("push"). + Short(i18n.T(i18n.CmdPushDesc)). + Long(i18n.T(i18n.CmdPushDesc)+"\n\n"+i18n.T(i18n.PushDescLong)). + ScopeLevel(cmdBuilder.Service). + StringFlag("workingDir", "./", i18n.T(i18n.BuildWorkingDir)). + StringFlag("archiveFilePath", "", i18n.T(i18n.BuildArchiveFilePath)). + StringFlag("versionName", "", i18n.T(i18n.BuildVersionName)). + StringFlag("source", "", i18n.T(i18n.SourceName)). + BoolFlag("deployGitFolder", false, i18n.T(i18n.UploadGitFolder)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks + + arch := archiveClient.New(archiveClient.Config{ + DeployGitFolder: cmdData.Params.GetBool("deployGitFolder"), + }) + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart)) + + files, err := arch.FindGitFiles(cmdData.Params.GetString("workingDir")) + if err != nil { + return err + } + + configContent, err := buildConfigContent(files) + if err != nil { + return err + } + + reader, writer := io.Pipe() + defer reader.Close() + + tarErrChan := make(chan error, 1) + + go arch.TarFiles(writer, files, tarErrChan) + + r, err := savePackage(cmdData.Params.GetString("archiveFilePath"), reader) + if err != nil { + return err + } + + appVersion, err := createAppVersion( + ctx, + cmdData.RestApiClient, + cmdData.Service, + cmdData.Params.GetString("versionName"), + ) + if err != nil { + return err + } + + // FIXME - janhajek merge with sdk client + HttpClient := httpClient.New(ctx, httpClient.Config{ + HttpTimeout: time.Minute * 15, + }) + + // FIXME - janhajek spinner? + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageStart)) + if err := packageUpload(HttpClient, appVersion.UploadUrl.String(), r); err != nil { + // if an error occurred while packing the app, return that error + select { + case err := <-tarErrChan: + return err + default: + return err + } + } + + // wait for packing and saving to finish (should already be done after the package upload has finished) + if tarErr := <-tarErrChan; tarErr != nil { + return tarErr + } + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageDone)) + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageDone)) + + if cmdData.Params.GetString("archiveFilePath") != "" { + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployPackageSavedInto, cmdData.Params.GetString("archiveFilePath"))) + } + + uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployDeployingStart)) + + sourceName := cmdData.Params.GetString("source") + if sourceName == "" { + sourceName = cmdData.Service.Name.String() + } + + deployResponse, err := cmdData.RestApiClient.PutAppVersionBuildAndDeploy(ctx, + path.AppVersionId{ + Id: appVersion.Id, + }, + body.PutAppVersionBuildAndDeploy{ + BuildConfigContent: types.MediumText(base64.StdEncoding.EncodeToString(configContent)), + Source: types.NewStringNull(sourceName), + }, + ) + if err != nil { + return err + } + + deployProcess, err := deployResponse.Output() + if err != nil { + return err + } + + err = uxHelpers.ProcessCheckWithSpinner( + ctx, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: deployProcess.Id, + RunningMessage: i18n.T(i18n.PushRunning), + ErrorMessageMessage: i18n.T(i18n.PushRunning), + SuccessMessage: i18n.T(i18n.PushFinished), + }}, + ) + if err != nil { + return err + } + + return nil + }) +} + +func createAppVersion( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service *entity.Service, + versionName string, +) (output.PostAppVersion, error) { + appVersionResponse, err := restApiClient.PostAppVersion( + ctx, + body.PostAppVersion{ + ServiceStackId: service.ID, + Name: func() types.StringNull { + if versionName != "" { + return types.NewStringNull(versionName) + } + return types.StringNull{} + }(), + }, + ) + if err != nil { + return output.PostAppVersion{}, err + } + appVersion, err := appVersionResponse.Output() + if err != nil { + return output.PostAppVersion{}, err + } + + return appVersion, nil +} + +func savePackage(archiveFilePath string, reader io.Reader) (io.Reader, error) { + if archiveFilePath == "" { + return reader, nil + } + + filePath, err := filepath.Abs(archiveFilePath) + if err != nil { + return reader, err + } + + // check if the target file exists + _, err = os.Stat(filePath) + if err != nil && !os.IsNotExist(err) { + return reader, err + } + if err == nil { + return reader, errors.Errorf(i18n.T(i18n.ArchClientFileAlreadyExists), archiveFilePath) + } + + file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0660) + if err != nil { + return reader, err + } + + return io.TeeReader(reader, file), nil +} + +func packageUpload(client *httpClient.Handler, uploadUrl string, reader io.Reader) error { + cephResponse, err := client.PutStream(uploadUrl, reader, httpClient.ContentType("application/gzip")) + if err != nil { + return err + } + if cephResponse.StatusCode != http.StatusCreated { + return errors.New(i18n.T(i18n.BuildDeployUploadPackageFailed)) + } + + return nil +} + +func buildConfigContent(files []archiveClient.File) ([]byte, error) { + for _, file := range files { + if file.ArchivePath == ZeropsYamlFileName { + stat, err := os.Stat(file.SourcePath) + if err != nil { + return nil, err + } + + if stat.Size() == 0 { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlEmpty)) + } + if stat.Size() > 10*1024 { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlTooLarge)) + } + + buildConfigContent, err := os.ReadFile(file.SourcePath) + if err != nil { + return nil, err + } + + return buildConfigContent, nil + } + } + + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound)) +} diff --git a/src/cmd/serviceStart.go b/src/cmd/serviceStart.go index 3721d67d..0562e2f5 100644 --- a/src/cmd/serviceStart.go +++ b/src/cmd/serviceStart.go @@ -2,81 +2,52 @@ package cmd import ( "context" - "time" - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/startStopDelete" - "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/dto/input/path" ) -func serviceStartCmd() *cobra.Command { - cmdStart := &cobra.Command{ - Use: "start projectNameOrId serviceName [flags]", - Short: i18n.CmdServiceStart, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) +func serviceStartCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("start"). + Short(i18n.T(i18n.CmdServiceStart)). + ScopeLevel(cmdBuilder.Service). + Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg(), cmdBuilder.OptionalArgLabel("{serviceName | serviceId}")). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + startServiceResponse, err := cmdData.RestApiClient.PutServiceStackStart( + ctx, + path.ServiceStackId{ + Id: cmdData.Service.ID, + }, + ) if err != nil { return err } - region, err := createRegionRetriever(ctx) + responseOutput, err := startServiceResponse.Output() if err != nil { return err } - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } + processId := responseOutput.Id - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + err = uxHelpers.ProcessCheckWithSpinner( ctx, - reg.GrpcApiAddress, - token, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: processId, + RunningMessage: i18n.T(i18n.ServiceStarting), + ErrorMessageMessage: i18n.T(i18n.ServiceStarting), + SuccessMessage: i18n.T(i18n.ServiceStarted), + }}, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - handler := startStopDelete.New(startStopDelete.Config{}, client, apiGrpcClient, sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}) - - cmdData := startStopDelete.CmdType{ - Start: i18n.ServiceStart, - Finish: i18n.ServiceStarted, - Execute: handler.ServiceStart, - } - return handler.Run(ctx, startStopDelete.RunConfig{ - ProjectNameOrId: args[0], - ServiceName: args[1], - ParentCmd: constants.Service, - Confirm: true, - CmdData: cmdData, - }) - }, - } - cmdStart.Flags().BoolP("help", "h", false, helpText(i18n.ServiceStartHelp)) - return cmdStart + return nil + }) } diff --git a/src/cmd/serviceStop.go b/src/cmd/serviceStop.go index c3250ee9..fd8cd272 100644 --- a/src/cmd/serviceStop.go +++ b/src/cmd/serviceStop.go @@ -2,86 +2,53 @@ package cmd import ( "context" - "time" - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zcli/src/cliAction/startStopDelete" - "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/sdkConfig" ) -func serviceStopCmd() *cobra.Command { - cmdStop := &cobra.Command{ - Use: "stop projectNameOrId serviceName [flags]", - Short: i18n.CmdServiceStop, - Args: ExactNArgs(2), - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) +func serviceStopCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("stop"). + Short(i18n.T(i18n.CmdServiceStop)). + ScopeLevel(cmdBuilder.Service). + Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + stopServiceResponse, err := cmdData.RestApiClient.PutServiceStackStop( + ctx, + path.ServiceStackId{ + Id: cmdData.Service.ID, + }, + ) if err != nil { return err } - region, err := createRegionRetriever(ctx) + responseOutput, err := stopServiceResponse.Output() if err != nil { return err } - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } + processId := responseOutput.Id - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{ - CaCertificateUrl: reg.CaCertificateUrl, - }) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( + err = uxHelpers.ProcessCheckWithSpinner( ctx, - reg.GrpcApiAddress, - token, + cmdData.UxBlocks, + cmdData.RestApiClient, + []uxHelpers.Process{{ + Id: processId, + RunningMessage: i18n.T(i18n.ServiceStopping), + ErrorMessageMessage: i18n.T(i18n.ServiceStopping), + SuccessMessage: i18n.T(i18n.ServiceStopped), + }}, ) if err != nil { return err } - defer closeFunc() - - client := httpClient.New(ctx, httpClient.Config{ - HttpTimeout: time.Minute * 15, - }) - - handler := startStopDelete.New( - startStopDelete.Config{}, - client, - apiGrpcClient, - sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}, - ) - - cmdData := startStopDelete.CmdType{ - Start: i18n.ServiceStop, - Finish: i18n.ServiceStopped, - Execute: handler.ServiceStop, - } - return handler.Run(ctx, startStopDelete.RunConfig{ - ProjectNameOrId: args[0], - ServiceName: args[1], - ParentCmd: constants.Service, - Confirm: true, - CmdData: cmdData, - }) - }, - } - cmdStop.Flags().BoolP("help", "h", false, helpText(i18n.ServiceStopHelp)) - return cmdStop + return nil + }) } diff --git a/src/cmd/status.go b/src/cmd/status.go new file mode 100644 index 00000000..0a66f8a4 --- /dev/null +++ b/src/cmd/status.go @@ -0,0 +1,14 @@ +package cmd + +import ( + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" +) + +func statusCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("status"). + Short(i18n.T(i18n.CmdStatus)). + AddChildrenCmd(statusShowDebugLogsCmd()). + AddChildrenCmd(statusInfoCmd()) +} diff --git a/src/cmd/statusInfo.go b/src/cmd/statusInfo.go new file mode 100644 index 00000000..b76e0d41 --- /dev/null +++ b/src/cmd/statusInfo.go @@ -0,0 +1,53 @@ +package cmd + +import ( + "context" + _ "embed" + + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/constants" + repository2 "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" +) + +func statusInfoCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("info"). + Short(i18n.T(i18n.CmdStatusInfo)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + body := &uxBlock.TableBody{} + + cliDataFilePath, err := constants.CliDataFilePath() + if err != nil { + cliDataFilePath = err.Error() + } + body.AddStringsRow(i18n.T(i18n.StatusInfoCliDataFilePath), cliDataFilePath) + + logFilePath, err := constants.LogFilePath() + if err != nil { + logFilePath = err.Error() + } + body.AddStringsRow(i18n.T(i18n.StatusInfoLogFilePath), logFilePath) + + if cmdData.CliStorage.Data().ScopeProjectId.Filled() { + // project scope is set + projectId, _ := cmdData.CliStorage.Data().ScopeProjectId.Get() + project, err := repository2.GetProjectById(ctx, cmdData.RestApiClient, projectId) + if err != nil { + if errorsx.IsUserError(err) { + cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) + } + + return err + } + + body.AddStringsRow(i18n.T(i18n.ScopedProject), project.Name.String()) + } + + cmdData.UxBlocks.Table(body) + + return nil + }) +} diff --git a/src/cmd/logShow.go b/src/cmd/statusShowDebugLogs.go similarity index 56% rename from src/cmd/logShow.go rename to src/cmd/statusShowDebugLogs.go index 00855db2..e1ed0578 100644 --- a/src/cmd/logShow.go +++ b/src/cmd/statusShowDebugLogs.go @@ -1,24 +1,27 @@ package cmd import ( + "context" "fmt" "io" "os" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/i18n" - - "github.com/spf13/cobra" ) -func logShowCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "show", - Short: i18n.CmdLogShow, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { +func statusShowDebugLogsCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("show-debug-logs"). + Short(i18n.T(i18n.CmdStatusShowDebugLogs)). + GuestRunFunc(func(ctx context.Context, cmdData *cmdBuilder.GuestCmdData) error { + logFilePath, err := constants.LogFilePath() + if err != nil { + return err + } - f, err := os.OpenFile(constants.LogFilePath, os.O_RDONLY, 0777) + f, err := os.OpenFile(logFilePath, os.O_RDONLY, 0777) if err != nil { return err } @@ -28,6 +31,12 @@ func logShowCmd() *cobra.Command { stat, _ := f.Stat() filesize := stat.Size() + if filesize == 0 { + // FIXME - janhajek translate + fmt.Println("No logs found") + return nil + } + lines := []string{} for { cursor -= 1 @@ -44,7 +53,7 @@ func logShowCmd() *cobra.Command { line = "" } - line = fmt.Sprintf("%s%s", string(char), line) // there is more efficient way + line = fmt.Sprintf("%s%s", string(char), line) if cursor == -filesize { // stop if we are at the begining lines = append([]string{line}, lines...) @@ -57,9 +66,5 @@ func logShowCmd() *cobra.Command { } return nil - }, - } - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.LogShowHelp)) - return cmd + }) } diff --git a/src/cmd/uxHelpers.go b/src/cmd/uxHelpers.go new file mode 100644 index 00000000..426870cd --- /dev/null +++ b/src/cmd/uxHelpers.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "context" + + "github.com/zeropsio/zcli/src/cmdBuilder" +) + +func YesNoPromptDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData, message string) (bool, error) { + if cmdData.QuietMode == cmdBuilder.QuietModeConfirmNothing { + return true, nil + } + + // FIXME - janhajek translate + choices := []string{"no", "yes"} + choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) + if err != nil { + return false, err + } + + return choice == 1, nil +} + +func YesNoPromptNonDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData, message string) (bool, error) { + if cmdData.QuietMode == cmdBuilder.QuietModeConfirmNothing || cmdData.QuietMode == cmdBuilder.QuietModeConfirmOnlyDestructive { + return true, nil + } + + // FIXME - janhajek translate + choices := []string{"no", "yes"} + choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) + if err != nil { + return false, err + } + + return choice == 1, nil +} diff --git a/src/cmd/version.go b/src/cmd/version.go index 43b11665..7242ec13 100644 --- a/src/cmd/version.go +++ b/src/cmd/version.go @@ -1,24 +1,23 @@ package cmd import ( + "context" "fmt" "runtime" - "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" ) var Version string -func versionCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "version", - Short: i18n.CmdVersion, - SilenceUsage: true, - Run: func(cmd *cobra.Command, args []string) { +func versionCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("version"). + Short(i18n.T(i18n.CmdVersion)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { fmt.Printf("zcli version %s (%s) %s/%s\n", Version, runtime.Version(), runtime.GOOS, runtime.GOARCH) - }, - } - cmd.Flags().BoolP("help", "h", false, helpText(i18n.VersionHelp)) - return cmd + + return nil + }) } diff --git a/src/cmd/vpn.go b/src/cmd/vpn.go deleted file mode 100644 index 4a82fcd0..00000000 --- a/src/cmd/vpn.go +++ /dev/null @@ -1,22 +0,0 @@ -package cmd - -import ( - "github.com/zeropsio/zcli/src/i18n" - - "github.com/spf13/cobra" -) - -func vpnCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "vpn", - Short: i18n.CmdVpn, - SilenceUsage: true, - } - - cmd.AddCommand(vpnStartCmd()) - cmd.AddCommand(vpnStopCmd()) - cmd.AddCommand(vpnStatusCmd()) - - cmd.Flags().BoolP("help", "h", false, helpText(i18n.GroupHelp)) - return cmd -} diff --git a/src/cmd/vpnStart.go b/src/cmd/vpnStart.go deleted file mode 100644 index a6abb852..00000000 --- a/src/cmd/vpnStart.go +++ /dev/null @@ -1,124 +0,0 @@ -package cmd - -import ( - "context" - "errors" - "regexp" - "strconv" - - "github.com/spf13/cobra" - - "github.com/zeropsio/zcli/src/cliAction/startVpn" - "github.com/zeropsio/zcli/src/daemonInstaller" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -func vpnStartCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "start projectNameOrId", - Short: i18n.CmdVpnStart, - Long: i18n.VpnStartLong, - SilenceUsage: true, - Args: ExactNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - storage, err := createCliStorage() - if err != nil { - return err - } - token, err := getToken(storage) - if err != nil { - return err - } - - region, err := createRegionRetriever(ctx) - if err != nil { - return err - } - - reg, err := region.RetrieveFromFile() - if err != nil { - return err - } - - caCertUrl := reg.CaCertificateUrl - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{CaCertificateUrl: caCertUrl}) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient( - ctx, - reg.GrpcApiAddress, - token, - ) - if err != nil { - return err - } - defer closeFunc() - - installer, err := daemonInstaller.New(daemonInstaller.Config{}) - if err != nil { - return err - } - - preferredPortMin, preferredPortMax, err := getMinMaxPort(params.GetString(cmd, "preferredPort")) - if err != nil { - return err - } - - return startVpn.New( - startVpn.Config{ - GrpcApiAddress: reg.GrpcApiAddress, - VpnAddress: reg.VpnApiAddress, - }, - apiGrpcClient, - installer, - sdkConfig.Config{Token: token, RegionUrl: reg.RestApiAddress}, - ).Run(ctx, startVpn.RunConfig{ - ProjectNameOrId: args[0], - Token: token, - Mtu: params.GetUint32("mtu"), - PreferredPortMin: preferredPortMin, - PreferredPortMax: preferredPortMax, - CaCertificateUrl: caCertUrl, - }) - }, - } - - params.RegisterUInt32(cmd, "mtu", 1420, i18n.MtuFlag) - params.RegisterString(cmd, "preferredPort", "-", i18n.PreferredPortFlag) - cmd.Flags().BoolP("help", "h", false, helpText(i18n.VpnStartHelp)) - - return cmd -} - -func getMinMaxPort(in string) (uint32, uint32, error) { - if in == "" { - return 0, 0, nil - } - if in == "-" { - return 0, 0, nil - } - parts := regexp.MustCompile("^([1-9][0-9]{0,4})?-([1-9][0-9]{0,4})?$").FindStringSubmatch(in) - if len(parts) != 3 { - return 0, 0, errors.New("invalid port range") - } - - var min int - var err error - if parts[1] != "" { - min, err = strconv.Atoi(parts[1]) - if err != nil { - return 0, 0, err - } - } - var max int - if parts[2] != "" { - max, err = strconv.Atoi(parts[2]) - if err != nil { - return 0, 0, err - } - } - return uint32(min), uint32(max), nil -} diff --git a/src/cmd/vpnStatus.go b/src/cmd/vpnStatus.go deleted file mode 100644 index 43551030..00000000 --- a/src/cmd/vpnStatus.go +++ /dev/null @@ -1,38 +0,0 @@ -package cmd - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/daemon" - - "github.com/zeropsio/zcli/src/i18n" - - "github.com/zeropsio/zcli/src/cliAction/statusVpn" - - "github.com/spf13/cobra" -) - -func vpnStatusCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "status", - Short: i18n.CmdVpnStatus, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - daemonClient, daemonCloseFunc, err := daemon.CreateClient(ctx) - if err != nil { - return err - } - defer daemonCloseFunc() - - return statusVpn.New( - statusVpn.Config{}, - daemonClient, - ).Run(ctx, statusVpn.RunConfig{}) - }, - } - cmd.Flags().BoolP("help", "h", false, helpText(i18n.VpnStatusHelp)) - return cmd -} diff --git a/src/cmd/vpnStop.go b/src/cmd/vpnStop.go deleted file mode 100644 index aad1e241..00000000 --- a/src/cmd/vpnStop.go +++ /dev/null @@ -1,38 +0,0 @@ -package cmd - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/daemon" - - "github.com/zeropsio/zcli/src/i18n" - - "github.com/zeropsio/zcli/src/cliAction/stopVpn" - - "github.com/spf13/cobra" -) - -func vpnStopCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "stop", - Short: i18n.CmdVpnStop, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := context.WithCancel(cmd.Context()) - regSignals(cancel) - - daemonClient, daemonCloseFunc, err := daemon.CreateClient(ctx) - if err != nil { - return err - } - defer daemonCloseFunc() - - return stopVpn.New( - stopVpn.Config{}, - daemonClient, - ).Run(ctx, stopVpn.RunConfig{}) - }, - } - cmd.Flags().BoolP("help", "h", false, helpText(i18n.VpnStopHelp)) - return cmd -} diff --git a/src/cmdBuilder/cmd.go b/src/cmdBuilder/cmd.go new file mode 100644 index 00000000..0cbc3723 --- /dev/null +++ b/src/cmdBuilder/cmd.go @@ -0,0 +1,149 @@ +package cmdBuilder + +import ( + "context" +) + +type loggedUserRunFunc func(ctx context.Context, cmdData *LoggedUserCmdData) error +type guestRunFunc func(ctx context.Context, cmdData *GuestCmdData) error + +type Cmd struct { + use string + short string + long string + loggedUserRunFunc loggedUserRunFunc + guestRunFunc guestRunFunc + silenceUsage bool + + scopeLevel Dependency + args []cmdArg + flags []cmdFlag + + childrenCmds []*Cmd +} + +type cmdArg struct { + name string + optional bool + isArray bool + optionalLabel string +} + +type cmdFlag struct { + name string + defaultValue interface{} + description string + hidden bool +} + +func NewCmd() *Cmd { + return &Cmd{ + silenceUsage: true, + } +} + +func (cmd *Cmd) AddChildrenCmd(childrenCmd *Cmd) *Cmd { + cmd.childrenCmds = append(cmd.childrenCmds, childrenCmd) + return cmd +} + +func (cmd *Cmd) Use(use string) *Cmd { + cmd.use = use + return cmd +} + +func (cmd *Cmd) Short(short string) *Cmd { + cmd.short = short + return cmd +} + +func (cmd *Cmd) Long(long string) *Cmd { + cmd.long = long + return cmd +} + +func (cmd *Cmd) LoggedUserRunFunc(runFunc loggedUserRunFunc) *Cmd { + cmd.loggedUserRunFunc = runFunc + return cmd +} + +func (cmd *Cmd) GuestRunFunc(runFunc guestRunFunc) *Cmd { + cmd.guestRunFunc = runFunc + return cmd +} + +func (cmd *Cmd) SilenceUsage(silenceUsage bool) *Cmd { + cmd.silenceUsage = silenceUsage + return cmd +} + +func (cmd *Cmd) ScopeLevel(scopeLevel Dependency) *Cmd { + cmd.scopeLevel = scopeLevel + return cmd +} + +type ArgOption = func(cfg *cmdArg) + +func OptionalArg() ArgOption { + return func(cfg *cmdArg) { + cfg.optional = true + } +} + +func ArrayArg() ArgOption { + return func(cfg *cmdArg) { + cfg.isArray = true + } +} + +func OptionalArgLabel(label string) ArgOption { + return func(cfg *cmdArg) { + cfg.optionalLabel = label + } +} + +func (cmd *Cmd) Arg(name string, auxOptions ...ArgOption) *Cmd { + cfg := cmdArg{ + name: name, + } + for _, opt := range auxOptions { + opt(&cfg) + } + + cmd.args = append(cmd.args, cfg) + return cmd +} + +type FlagOption = func(cfg *cmdFlag) + +func HiddenFlag() FlagOption { + return func(cfg *cmdFlag) { + cfg.hidden = true + } +} + +func (cmd *Cmd) StringFlag(name string, defaultValue string, description string, auxOptions ...FlagOption) *Cmd { + return cmd.addFlag(name, defaultValue, description, auxOptions...) +} + +func (cmd *Cmd) IntFlag(name string, defaultValue int, description string, auxOptions ...FlagOption) *Cmd { + return cmd.addFlag(name, defaultValue, description, auxOptions...) +} + +func (cmd *Cmd) BoolFlag(name string, defaultValue bool, description string, auxOptions ...FlagOption) *Cmd { + return cmd.addFlag(name, defaultValue, description, auxOptions...) +} + +func (cmd *Cmd) addFlag(name string, defaultValue interface{}, description string, auxOptions ...FlagOption) *Cmd { + cfg := cmdFlag{ + name: name, + description: description, + defaultValue: defaultValue, + } + for _, opt := range auxOptions { + opt(&cfg) + } + + cmd.flags = append(cmd.flags, cfg) + return cmd +} diff --git a/src/cmdBuilder/cmdBuilder.go b/src/cmdBuilder/cmdBuilder.go new file mode 100644 index 00000000..4d5cfc69 --- /dev/null +++ b/src/cmdBuilder/cmdBuilder.go @@ -0,0 +1,13 @@ +package cmdBuilder + +type CmdBuilder struct { + commands []*Cmd +} + +func NewCmdBuilder() *CmdBuilder { + return &CmdBuilder{} +} + +func (b *CmdBuilder) AddCommand(cmd *Cmd) { + b.commands = append(b.commands, cmd) +} diff --git a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go new file mode 100644 index 00000000..7d2f79f3 --- /dev/null +++ b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go @@ -0,0 +1,67 @@ +package cmdBuilder + +import ( + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/params" +) + +func (b *CmdBuilder) buildCobraCmd(cmd *Cmd, params *params.Handler) (*cobra.Command, error) { + cobraCmd := &cobra.Command{ + Short: cmd.short, + SilenceUsage: cmd.silenceUsage, + } + + argNames := make([]string, len(cmd.args)) + for i, arg := range cmd.args { + argName := arg.name + if arg.optionalLabel != "" { + argName = arg.optionalLabel + } + if arg.optional { + argName = "[" + argName + "]" + } + argNames[i] = argName + } + cobraCmd.Use = strings.Join(append([]string{cmd.use}, argNames...), " ") + + for _, dep := range getDependencyListFromRoot(cmd.scopeLevel) { + dep.AddCommandFlags(cmd) + } + + for _, flag := range cmd.flags { + switch defaultValue := flag.defaultValue.(type) { + case string: + params.RegisterString(cobraCmd, flag.name, defaultValue, flag.description) + case int: + params.RegisterInt(cobraCmd, flag.name, defaultValue, flag.description) + case bool: + params.RegisterBool(cobraCmd, flag.name, defaultValue, flag.description) + default: + panic(fmt.Sprintf("unexpected type %T", flag.defaultValue)) + } + + if flag.hidden { + err := cobraCmd.Flags().MarkHidden(flag.name) + if err != nil { + return nil, err + } + } + } + + if cmd.guestRunFunc != nil || cmd.loggedUserRunFunc != nil { + cobraCmd.RunE = b.createCmdRunFunc(cmd, params) + } + + for _, childrenCmd := range cmd.childrenCmds { + cobraChildrenCmd, err := b.buildCobraCmd(childrenCmd, params) + if err != nil { + return nil, err + } + cobraCmd.AddCommand(cobraChildrenCmd) + } + + return cobraCmd, nil +} diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go new file mode 100644 index 00000000..5f59ec62 --- /dev/null +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -0,0 +1,289 @@ +package cmdBuilder + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/mattn/go-isatty" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/logger" + "github.com/zeropsio/zcli/src/params" + "github.com/zeropsio/zcli/src/storage" + "github.com/zeropsio/zcli/src/support" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/apiError" + "gopkg.in/yaml.v3" +) + +type ParamsReader interface { + GetString(name string) string + GetInt(name string) int + GetBool(name string) bool +} + +type CmdParamReader struct { + cobraCmd *cobra.Command + paramsHandler *params.Handler +} + +func newCmdParamReader(cobraCmd *cobra.Command, paramsHandler *params.Handler) *CmdParamReader { + return &CmdParamReader{ + cobraCmd: cobraCmd, + paramsHandler: paramsHandler, + } +} + +func (r *CmdParamReader) GetString(name string) string { + return r.paramsHandler.GetString(r.cobraCmd, name) +} + +func (r *CmdParamReader) GetInt(name string) int { + return r.paramsHandler.GetInt(r.cobraCmd, name) +} + +func (r *CmdParamReader) GetBool(name string) bool { + return r.paramsHandler.GetBool(r.cobraCmd, name) +} + +type GuestCmdData struct { + CliStorage *cliStorage.Handler + UxBlocks *uxBlock.UxBlocks + QuietMode QuietMode + Args map[string][]string + Params ParamsReader +} + +type LoggedUserCmdData struct { + *GuestCmdData + RestApiClient *zeropsRestApiClient.Handler + + // optional params + Project *entity.Project + Service *entity.Service +} + +func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*cobra.Command, []string) error { + return func(cobraCmd *cobra.Command, args []string) (err error) { + ctx, cancel := context.WithCancel(context.Background()) + regSignals(cancel) + ctx = support.Context(ctx) + + loggerFilePath, err := constants.LogFilePath() + if err != nil { + return errors.New(i18n.T(i18n.LoggerUnableToOpenLogFileWarning)) + } + + isTerminal, err := isTerminal() + if err != nil { + return err + } + + outputLogger, debugFileLogger := createLoggers(isTerminal, loggerFilePath) + + uxBlocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, cancel) + + uxBlocks.PrintDebugLine(fmt.Sprintf("Command: %s", cobraCmd.CommandPath())) + + defer func() { + if err != nil { + printError(err, uxBlocks) + err = skipErr + } + }() + + err = params.InitViper() + if err != nil { + return err + } + + quietMode, err := getQuietMode(isTerminal) + if err != nil { + return err + } + + cliStorage, err := createCliStorage() + if err != nil { + return err + } + + argsMap, err := convertArgs(cmd, args) + if err != nil { + return err + } + + guestCmdData := &GuestCmdData{ + CliStorage: cliStorage, + UxBlocks: uxBlocks, + QuietMode: quietMode, + Args: argsMap, + Params: newCmdParamReader(cobraCmd, params), + } + + if cmd.loggedUserRunFunc != nil { + storedData := cliStorage.Data() + + token := storedData.Token + if token == "" { + return errors.New(i18n.T(i18n.UnauthenticatedUser)) + } + + cmdData := &LoggedUserCmdData{ + + GuestCmdData: guestCmdData, + } + + cmdData.RestApiClient = zeropsRestApiClient.NewAuthorizedClient(token, storedData.RegionData.RestApiAddress) + + for _, dep := range getDependencyListFromRoot(cmd.scopeLevel) { + err := dep.LoadSelectedScope(cobraCmd.Context(), cmd, cmdData) + if err != nil { + return err + } + } + return cmd.loggedUserRunFunc(cobraCmd.Context(), cmdData) + + } + + return cmd.guestRunFunc(cobraCmd.Context(), guestCmdData) + } +} + +func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { + var requiredArgsCount int + var isArray bool + for i, arg := range cmd.args { + if arg.optional && i != len(cmd.args)-1 { + return nil, errors.Errorf("optional arg %s can be only the last one", arg.name) + } + if arg.isArray && i != len(cmd.args)-1 { + return nil, errors.Errorf("array arg %s can be only the last one", arg.name) + } + if !arg.optional { + requiredArgsCount++ + } + isArray = arg.isArray + } + + if len(args) < requiredArgsCount { + // FIXME - janhajek message + return nil, errors.Errorf("expected at least %d arg(s), got %d", requiredArgsCount, len(args)) + } + + // the last arg is not an array, max number of given args can't be greater than the number of registered args + if !isArray && len(args) > len(cmd.args) { + // FIXME - janhajek message + return nil, errors.Errorf("expected no more than %d arg(s), got %d", len(cmd.args), len(args)) + } + + argsMap := make(map[string][]string) + for i, arg := range cmd.args { + if len(args) > i { + if arg.isArray { + argsMap[arg.name] = args[i:] + } else { + argsMap[arg.name] = []string{args[i]} + } + } + } + + return argsMap, nil +} + +func printError(err error, uxBlocks *uxBlock.UxBlocks) { + uxBlocks.PrintDebugLine(fmt.Sprintf("error: %+v", err)) + + if userErr := errorsx.AsUserError(err); userErr != nil { + uxBlocks.PrintErrorLine(err.Error()) + return + } + + var apiErr apiError.Error + if errors.As(err, &apiErr) { + uxBlocks.PrintErrorLine(apiErr.GetMessage()) + if apiErr.GetMeta() != nil { + meta, err := yaml.Marshal(apiErr.GetMeta()) + if err != nil { + uxBlocks.PrintErrorLine(fmt.Sprintf("couldn't parse meta of error: %s", apiErr.GetMessage())) + } + uxBlocks.PrintErrorLine(string(meta)) + } + + return + } + + uxBlocks.PrintErrorLine(err.Error()) +} + +func getQuietMode(isTerminal bool) (QuietMode, error) { + if !isTerminal { + return QuietModeConfirmNothing, nil + } + + switch QuietMode(QuietModeFlag) { + case QuietModeConfirmNothing, QuietModeConfirmAll, QuietModeConfirmOnlyDestructive: + return QuietMode(QuietModeFlag), nil + default: + // FIXME - janhajek message + return 0, errors.New("unknown quiet mode") + } +} + +func isTerminal() (bool, error) { + switch TerminalMode(TerminalFlag) { + case TerminalModeAuto: + return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()), nil + case TerminalModeDisabled: + return false, nil + case TerminalModeEnabled: + return true, nil + default: + // FIXME - janhajek message + return false, errors.New("unknown terminal mode") + } +} + +func createLoggers(isTerminal bool, logFilePathFlag string) (*logger.Handler, *logger.Handler) { + outputLogger := logger.NewOutputLogger(logger.OutputConfig{ + IsTerminal: isTerminal, + }) + + debugFileLogger := logger.NewDebugFileLogger(logger.DebugFileConfig{ + FilePath: logFilePathFlag, + }) + + return outputLogger, debugFileLogger +} + +func regSignals(contextCancel func()) { + sigs := make(chan os.Signal, 1) + + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + contextCancel() + }() +} + +func createCliStorage() (*cliStorage.Handler, error) { + filePath, err := constants.CliDataFilePath() + if err != nil { + return nil, err + } + s, err := storage.New[cliStorage.Data]( + storage.Config{ + FilePath: filePath, + }, + ) + return &cliStorage.Handler{Handler: s}, err +} diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go b/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go new file mode 100644 index 00000000..5f1adb13 --- /dev/null +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go @@ -0,0 +1,178 @@ +package cmdBuilder + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestConvertArgs(t *testing.T) { + type args struct { + cmd *Cmd + args []string + } + tests := []struct { + name string + args args + want map[string][]string + wantErr string + }{ + { + name: "no args", + args: args{ + cmd: NewCmd(), + args: []string{}, + }, + want: map[string][]string{}, + wantErr: "", + }, + { + name: "one required arg", + args: args{ + cmd: (NewCmd()).Arg("arg1"), + args: []string{"value1"}, + }, + want: map[string][]string{"arg1": {"value1"}}, + wantErr: "", + }, + { + name: "one required arg, one optional arg, one value", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", OptionalArg()), + args: []string{"value1"}, + }, + want: map[string][]string{"arg1": {"value1"}}, + wantErr: "", + }, + { + name: "one required arg, one optional arg, two values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", OptionalArg()), + args: []string{"value1", "value2"}, + }, + want: map[string][]string{"arg1": {"value1"}, "arg2": {"value2"}}, + wantErr: "", + }, + { + name: "one required arg, one optional array arg, one value", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", ArrayArg(), OptionalArg()), + args: []string{"value1"}, + }, + want: map[string][]string{"arg1": {"value1"}}, + wantErr: "", + }, + { + name: "one required arg, one optional array arg, two values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", ArrayArg(), OptionalArg()), + args: []string{"value1", "value2"}, + }, + want: map[string][]string{"arg1": {"value1"}, "arg2": {"value2"}}, + wantErr: "", + }, + { + name: "one required arg, one array arg, two values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", ArrayArg()), + args: []string{"value1", "value2"}, + }, + want: map[string][]string{"arg1": {"value1"}, "arg2": {"value2"}}, + wantErr: "", + }, + { + name: "one required arg, one array arg, three values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", ArrayArg()), + args: []string{"value1", "value2", "value3"}, + }, + want: map[string][]string{"arg1": {"value1"}, "arg2": {"value2", "value3"}}, + wantErr: "", + }, + // errors + { + name: "no args, one value", + args: args{ + cmd: NewCmd(), + args: []string{"value1"}, + }, + want: nil, + wantErr: "expected no more than 0 arg(s), got 1", + }, + { + name: "one required arg, no value", + args: args{ + cmd: (NewCmd()).Arg("arg1"), + args: []string{}, + }, + want: nil, + wantErr: "expected at least 1 arg(s), got 0", + }, + { + name: "one required arg, one optional arg, no values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", OptionalArg()), + args: []string{}, + }, + want: nil, + wantErr: "expected at least 1 arg(s), got 0", + }, + { + name: "one required arg, one optional arg, three values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", OptionalArg()), + args: []string{"value1", "value2", "value3"}, + }, + want: nil, + wantErr: "expected no more than 2 arg(s), got 3", + }, + { + name: "one required arg, one optional array arg, no values", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", ArrayArg(), OptionalArg()), + args: []string{}, + }, + want: nil, + wantErr: "expected at least 1 arg(s), got 0", + }, + { + name: "one required arg, one array arg, one value", + args: args{ + cmd: (NewCmd()).Arg("arg1").Arg("arg2", ArrayArg()), + args: []string{"value1"}, + }, + want: nil, + wantErr: "expected at least 2 arg(s), got 1", + }, + // settings errors + { + name: "optional arg must be the last one", + args: args{ + cmd: (NewCmd()).Arg("arg1", OptionalArg()).Arg("arg2"), + args: nil, + }, + want: nil, + wantErr: "optional arg arg1 can be only the last on", + }, + { + name: "array arg must be the last one", + args: args{ + cmd: (NewCmd()).Arg("arg1", ArrayArg()).Arg("arg2"), + args: nil, + }, + want: nil, + wantErr: "array arg arg1 can be only the last on", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := convertArgs(tt.args.cmd, tt.args.args) + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } else { + require.NoError(t, err) + } + require.Equal(t, tt.want, got) + }) + } +} diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go new file mode 100644 index 00000000..a6a434af --- /dev/null +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -0,0 +1,81 @@ +package cmdBuilder + +import ( + "fmt" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/params" +) + +type QuietMode int + +const ( + QuietModeConfirmAll QuietMode = iota + QuietModeConfirmOnlyDestructive + QuietModeConfirmNothing +) + +var QuietModeFlag int + +type TerminalMode string + +const ( + TerminalModeAuto TerminalMode = "auto" + TerminalModeDisabled = "disabled" + TerminalModeEnabled = "enabled" +) + +var TerminalFlag string + +// Chicken-and-egg problem. +// I would like to log errors at one place after the execution of the root command. +// To do that, I need to know the log file path before the execution. +// To know the log file path, I need to parse the persistent flags. +// But these flags are parsed during the execution of the root command. +// So, I moved the logging inside the root command. +// This way, it logs everything. Except the unknown command error. +// This error needs to be handled here. Simple fmt.Println(err.Error()) is enough. +// But with this line, other errors are logged twice. Once here, once in the root command. +// So, I added a special error to skip the logging after the root command. +var skipErr = errors.New("skip") + +func (b *CmdBuilder) CreateAndExecuteRootCobraCmd() error { + rootCmd := createRootCommand() + + params := params.New() + + for _, cmd := range b.commands { + cobraCmd, err := b.buildCobraCmd(cmd, params) + if err != nil { + return err + } + rootCmd.AddCommand(cobraCmd) + } + + err := rootCmd.Execute() + if err != nil { + if !errors.Is(err, skipErr) { + fmt.Println(err.Error()) + } + } + + return nil +} + +func createRootCommand() *cobra.Command { + rootCmd := &cobra.Command{ + Use: "zcli", + CompletionOptions: cobra.CompletionOptions{HiddenDefaultCmd: true}, + SilenceErrors: true, + } + + // FIXME - janhajek add a dynamic help for subcommands + rootCmd.Flags().BoolP("help", "h", false, i18n.T(i18n.DisplayHelp)+i18n.T(i18n.GroupHelp)) + + rootCmd.PersistentFlags().IntVar(&QuietModeFlag, "quiet", int(QuietModeConfirmAll), i18n.T(i18n.QuietModeFlag)) + rootCmd.PersistentFlags().StringVar(&TerminalFlag, "terminal", "auto", i18n.T(i18n.TerminalFlag)) + + return rootCmd +} diff --git a/src/cmdBuilder/dependencyTree.go b/src/cmdBuilder/dependencyTree.go new file mode 100644 index 00000000..d6b54c11 --- /dev/null +++ b/src/cmdBuilder/dependencyTree.go @@ -0,0 +1,49 @@ +package cmdBuilder + +import ( + "context" + "slices" +) + +// FIXME - janhajek do we need interface? +type Dependency interface { + AddCommandFlags(*Cmd) + LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error + GetParent() Dependency +} + +type commonDependency struct { + parent Dependency +} + +func (c *commonDependency) GetParent() Dependency { + return c.parent +} + +// FIXME - janhajek move back cmd? +var Project *project +var Service *service + +func init() { + Project = &project{} + Service = &service{ + commonDependency: commonDependency{ + parent: Project, + }, + } +} + +func getDependencyListFromRoot(dep Dependency) []Dependency { + var list []Dependency + for { + if dep == nil { + break + } + list = append(list, dep) + dep = dep.GetParent() + } + + slices.Reverse(list) + + return list +} diff --git a/src/cmdBuilder/dependencyTreeProject.go b/src/cmdBuilder/dependencyTreeProject.go new file mode 100644 index 00000000..ffb6d730 --- /dev/null +++ b/src/cmdBuilder/dependencyTreeProject.go @@ -0,0 +1,77 @@ +package cmdBuilder + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type project struct { + commonDependency +} + +const ProjectArgName = "projectId" + +func (p *project) AddCommandFlags(cmd *Cmd) { + // FIXME - janhajek translation + cmd.StringFlag(ProjectArgName, "", "Project id") +} + +func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error { + infoText := i18n.SelectedProject + var project *entity.Project + var err error + + // project scope is set + if cmdData.CliStorage.Data().ScopeProjectId.Filled() { + projectId, _ := cmdData.CliStorage.Data().ScopeProjectId.Get() + + project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) + if err != nil { + if errorsx.IsUserError(err) { + cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) + } + + return err + } + + infoText = i18n.ScopedProject + } + + if projectId, exists := cmdData.Args[ProjectArgName]; exists { + project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(projectId[0])) + if err != nil { + return err + } + + infoText = i18n.SelectedProject + } + + // service id is passed as a flag + if projectId := cmdData.Params.GetString(ProjectArgName); projectId != "" { + project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(projectId)) + if err != nil { + return err + } + + infoText = i18n.SelectedProject + } + + if project == nil { + // interactive selector of a project + project, err = uxHelpers.PrintProjectSelector(ctx, cmdData.UxBlocks, cmdData.RestApiClient) + if err != nil { + return err + } + } + + cmdData.Project = project + cmdData.UxBlocks.PrintInfoLine(i18n.T(infoText, cmdData.Project.Name.String())) + + return nil +} diff --git a/src/cmdBuilder/dependencyTreeService.go b/src/cmdBuilder/dependencyTreeService.go new file mode 100644 index 00000000..e5f10697 --- /dev/null +++ b/src/cmdBuilder/dependencyTreeService.go @@ -0,0 +1,61 @@ +package cmdBuilder + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type service struct { + commonDependency +} + +const ServiceArgName = "serviceIdOrName" +const ServiceFlagName = "serviceId" + +func (s *service) AddCommandFlags(cmd *Cmd) { + // FIXME - janhajek translation + cmd.StringFlag(ServiceFlagName, "", "Service id") +} + +func (s *service) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error { + infoText := i18n.SelectedService + var service *entity.Service + var err error + + if serviceIdOrName, exists := cmdData.Args[ServiceArgName]; exists { + service, err = repository.GetServiceByIdOrName(ctx, cmdData.RestApiClient, cmdData.Project.ID, serviceIdOrName[0]) + if err != nil { + return err + } + } + + // service id is passed as a flag + if serviceId := cmdData.Params.GetString(ServiceFlagName); serviceId != "" { + service, err = repository.GetServiceById( + ctx, + cmdData.RestApiClient, + uuid.ServiceStackId(serviceId), + ) + if err != nil { + return err + } + } + + // interactive selector of service + if service == nil { + service, err = uxHelpers.PrintServiceSelector(ctx, cmdData.UxBlocks, cmdData.RestApiClient, *cmdData.Project) + if err != nil { + return err + } + } + + cmdData.Service = service + cmdData.UxBlocks.PrintInfoLine(i18n.T(infoText, cmdData.Service.Name.String())) + + return nil +} diff --git a/src/utils/cmdRunner/run.go b/src/cmdRunner/run.go similarity index 96% rename from src/utils/cmdRunner/run.go rename to src/cmdRunner/run.go index e95b0287..7a2644f9 100644 --- a/src/utils/cmdRunner/run.go +++ b/src/cmdRunner/run.go @@ -48,7 +48,8 @@ func Run(cmd *exec.Cmd) ([]byte, ExecErrInterface) { if err := cmd.Run(); err != nil { exitCode := 0 - if exitError, ok := err.(*exec.ExitError); ok { + var exitError *exec.ExitError + if errors.As(err, &exitError) { exitCode = exitError.ExitCode() } diff --git a/src/utils/cmdRunner/run_test.go b/src/cmdRunner/run_test.go similarity index 100% rename from src/utils/cmdRunner/run_test.go rename to src/cmdRunner/run_test.go diff --git a/src/constants/darwin.go b/src/constants/darwin.go index 61efe8b3..ecb32b7d 100644 --- a/src/constants/darwin.go +++ b/src/constants/darwin.go @@ -3,9 +3,33 @@ package constants -const ( - LogFilePath = "/usr/local/var/log/zerops.log" - DaemonAddress = "/usr/local/var/zerops/daemon.sock" - DaemonStorageFilePath = "/usr/local/var/zerops/daemon.data" - DaemonInstallDir = "/usr/local/" +import ( + "os" + "path" + + "github.com/pkg/errors" ) + +func getDataFilePaths() []pathReceiver { + return []pathReceiver{ + func() (string, error) { + env := os.Getenv(cliDataFilePathEnvVar) + if env != "" { + return env, nil + } + return "", errors.New("env is empty") + }, + receiverWithPath(os.UserConfigDir, zeropsDir, cliDataFileName), + receiverWithPath(os.UserHomeDir, zeropsDir, cliDataFileName), + } +} + +func getLogFilePath() []pathReceiver { + return []pathReceiver{ + func() (string, error) { + return path.Join("/usr/local/var/log/", zeropsLogFile), nil + }, + receiverWithPath(os.UserConfigDir, zeropsDir, zeropsLogFile), + receiverWithPath(os.UserHomeDir, zeropsDir, zeropsLogFile), + } +} diff --git a/src/constants/dns.go b/src/constants/dns.go deleted file mode 100644 index ce25e42c..00000000 --- a/src/constants/dns.go +++ /dev/null @@ -1,6 +0,0 @@ -package constants - -const ( - ResolvFilePath = "/etc/resolv.conf" - ResolvconfOrderFilePath = "/etc/resolvconf/interface-order" -) diff --git a/src/constants/general.go b/src/constants/general.go deleted file mode 100644 index ce6d5d87..00000000 --- a/src/constants/general.go +++ /dev/null @@ -1,3 +0,0 @@ -package constants - -const VpnApiGrpcPort = "64510" diff --git a/src/constants/linux.go b/src/constants/linux.go index c52f27d4..91a4db19 100644 --- a/src/constants/linux.go +++ b/src/constants/linux.go @@ -3,9 +3,19 @@ package constants -const ( - LogFilePath = "/var/log/zerops/zerops.log" - DaemonAddress = "/run/zerops/daemon.sock" - DaemonStorageFilePath = "/var/lib/zerops/daemon.data" - DaemonInstallDir = "/usr/local/" -) +func getDataFilePaths() []pathReceiver { + return []pathReceiver{ + receiverWithPath(os.UserConfigDir, zeropsDir, cliDataFileName), + receiverWithPath(os.UserHomeDir, zeropsDir, cliDataFileName), + } +} + +func getLogFilePath() []pathReceiver { + return []pathReceiver{ + func() (string, error) { + return path.Join("/var/log/", zeropsDir, zeropsLogFile), nil + }, + receiverWithPath(os.UserConfigDir, zeropsDir, zeropsLogFile), + receiverWithPath(os.UserHomeDir, zeropsDir, zeropsLogFile), + } +} diff --git a/src/constants/params.go b/src/constants/params.go deleted file mode 100644 index e99715df..00000000 --- a/src/constants/params.go +++ /dev/null @@ -1,26 +0,0 @@ -package constants - -import ( - "os" - "path/filepath" -) - -func CliLoginData() (string, error) { - return cliStorageFilepath("cli.data") -} - -func CliRegionData() (string, error) { - return cliStorageFilepath("region.data") -} - -func CliStorageFilepath() (string, error) { - return cliStorageFilepath("") -} - -func cliStorageFilepath(filename string) (string, error) { - configDir, err := os.UserConfigDir() - if err != nil { - return "", err - } - return filepath.Join(configDir, "zerops", filename), nil -} diff --git a/src/constants/projectServiceActions.go b/src/constants/projectServiceActions.go deleted file mode 100644 index 1dffe436..00000000 --- a/src/constants/projectServiceActions.go +++ /dev/null @@ -1,14 +0,0 @@ -package constants - -const ( - Success = "✓ " - Starting = "→ " - WorkingDir = "./" -) - -type ParentCmd int - -const ( - Project ParentCmd = iota - Service -) diff --git a/src/constants/windows.go b/src/constants/windows.go index 07a726d8..aa52bd16 100644 --- a/src/constants/windows.go +++ b/src/constants/windows.go @@ -5,24 +5,21 @@ package constants import ( "os" - "path/filepath" ) -var ( - LogFilePath, - DaemonStorageFilePath, - DaemonAddress, - DaemonInstallDir string -) - -const WireguardPath = `C:\Program Files\wireguard` - -func init() { - appData, _ := os.UserConfigDir() - zeropsFolder := filepath.Join(appData, "Zerops") +func getDataFilePaths() []pathReceiver { + return []pathReceiver{ + receiverWithPath(os.UserConfigDir, "Zerops", cliDataFileName), + receiverWithPath(os.UserHomeDir, "Zerops", cliDataFileName), + } +} - LogFilePath = filepath.Join(zeropsFolder, "zerops.log") - DaemonAddress = ":45677" - DaemonStorageFilePath = filepath.Join(zeropsFolder, "daemon.data") - DaemonInstallDir = zeropsFolder +func getLogFilePath() []pathReceiver { + return []pathReceiver{ + func() (string, error) { + return path.Join("/usr/local/var/log/", zeropsLogFile), nil + }, + receiverWithPath(os.UserConfigDir, "Zerops", zeropsLogFile), + receiverWithPath(os.UserHomeDir, "Zerops", zeropsLogFile), + } } diff --git a/src/constants/zerops.go b/src/constants/zerops.go new file mode 100644 index 00000000..2820d8ab --- /dev/null +++ b/src/constants/zerops.go @@ -0,0 +1,71 @@ +package constants + +import ( + "os" + "path" + "path/filepath" + + "github.com/pkg/errors" +) + +const ( + DefaultRegionUrl = "https://api.app.zerops.io/api/rest/public/region/zcli" + zeropsDir = "zerops" + zeropsLogFile = "zerops.log" + cliDataFileName = "cli.data" + cliDataFilePathEnvVar = "ZEROPS_CLI_DATA_FILE_PATH" + cliLogFilePathEnvVar = "ZEROPS_CLI_LOG_FILE_PATH" +) + +type pathReceiver func() (string, error) + +func CliDataFilePath() (string, error) { + return findFirstWritablePath(getDataFilePaths()) +} + +func LogFilePath() (string, error) { + return findFirstWritablePath(getLogFilePath()) +} + +func receiverWithPath(receiver pathReceiver, elem ...string) pathReceiver { + return func() (string, error) { + dir, err := receiver() + if err != nil { + return "", err + } + elem = append([]string{dir}, elem...) + + return filepath.Join(elem...), nil + } +} + +func findFirstWritablePath(paths []pathReceiver) (string, error) { + checkedPaths := make([]string, 0, len(paths)) + for _, p := range paths { + path, err := p() + if err == nil { + checkedPaths = append(checkedPaths, path) + if err := checkPath(path); err == nil { + return path, nil + } + } + } + + // FIXME - janhajek translate + return "", errors.Errorf("Unable to find writable path from %v", checkedPaths) +} + +func checkPath(filePath string) error { + dir := path.Dir(filePath) + + err := os.MkdirAll(dir, 0775) + if err != nil { + return err + } + + f, err := os.OpenFile(filePath, os.O_RDONLY|os.O_CREATE, 0666) + if err != nil { + return err + } + return f.Close() +} diff --git a/src/daemonInstaller/daemon.go b/src/daemonInstaller/daemon.go deleted file mode 100644 index 1e54221b..00000000 --- a/src/daemonInstaller/daemon.go +++ /dev/null @@ -1,15 +0,0 @@ -package daemonInstaller - -import "errors" - -type daemon interface { - Install() error - Remove() error - IsInstalled() bool -} - -var ( - ErrElevatedPrivileges = errors.New("Installation continues in the new window") - ErrAlreadyInstalled = errors.New("Service has already been installed") - ErrNotInstalled = errors.New("Service is not installed") -) diff --git a/src/daemonInstaller/handler.go b/src/daemonInstaller/handler.go deleted file mode 100644 index 63cbe3b2..00000000 --- a/src/daemonInstaller/handler.go +++ /dev/null @@ -1,56 +0,0 @@ -package daemonInstaller - -import ( - "os/exec" - - "github.com/zeropsio/zcli/src/i18n" - - "github.com/zeropsio/zcli/src/utils/cmdRunner" -) - -type Config struct { -} - -type Handler struct { - daemon daemon -} - -func New(_ Config) (*Handler, error) { - daemon, err := newDaemon("zeropsdaemon", i18n.DaemonInstallerDesc, []string{"network.target"}) - if err != nil { - return nil, err - } - - return &Handler{ - daemon: daemon, - }, nil -} - -func (h *Handler) Install() error { - return h.daemon.Install() -} - -func (h *Handler) Remove() error { - return h.daemon.Remove() -} - -func (h *Handler) IsInstalled() bool { - return h.daemon.IsInstalled() -} - -func sudoCommands(cmds ...*exec.Cmd) error { - for _, cmd := range cmds { - sudoCmd := exec.Command("sudo", cmd.Args...) - sudoCmd.Env = cmd.Env - sudoCmd.Stdin = cmd.Stdin - sudoCmd.Stderr = cmd.Stderr - sudoCmd.Stdout = cmd.Stdout - sudoCmd.Dir = cmd.Dir - - _, err := cmdRunner.Run(sudoCmd) - if err != nil { - return err - } - } - return nil -} diff --git a/src/daemonInstaller/handler_darwin.go b/src/daemonInstaller/handler_darwin.go deleted file mode 100644 index 36bd6b6b..00000000 --- a/src/daemonInstaller/handler_darwin.go +++ /dev/null @@ -1,200 +0,0 @@ -//go:build darwin -// +build darwin - -package daemonInstaller - -import ( - "errors" - "os" - "os/exec" - "path" - "path/filepath" - "regexp" - "text/template" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" -) - -type darwinRecord struct { - name string - description string - dependencies []string -} - -func newDaemon(name, description string, dependencies []string) (daemon, error) { - return &darwinRecord{ - name: name, - description: description, - dependencies: dependencies, - }, nil -} - -const defaultPath = "/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin" - -func (daemon *darwinRecord) Install() error { - if daemon.IsInstalled() { - return ErrAlreadyInstalled - } - - _, err := exec.LookPath("wg") - if err != nil { - return errors.New(i18n.DaemonInstallWireguardNotFoundDarwin) - } - - _, err = exec.LookPath("wireguard-go") - if err != nil { - return errors.New(i18n.DaemonInstallWireguardNotFoundDarwin) - } - - cliBinaryPath, err := os.Executable() - if err != nil { - return err - } - - serviceFilePath := path.Join(os.TempDir(), daemon.name) - file, err := os.Create(serviceFilePath) - if err != nil { - return err - } - defer file.Close() - - logDir := filepath.Dir(constants.LogFilePath) - daemonStorageDir := filepath.Dir(constants.DaemonStorageFilePath) - - userPath, ok := os.LookupEnv("PATH") - if !ok { - userPath = defaultPath - } - - templ, err := template.New("propertyList").Parse(propertyList) - if err != nil { - return err - } - if err := templ.Execute( - file, - &struct { - BinaryPath string - Name string - LogFile string - WorkingDir string - PathEnv string - }{ - BinaryPath: path.Join(constants.DaemonInstallDir, daemon.name), - Name: daemon.name, - LogFile: constants.LogFilePath, - WorkingDir: daemonStorageDir, - PathEnv: userPath, - }, - ); err != nil { - return err - } - - { - err := sudoCommands( - exec.Command("cp", serviceFilePath, daemon.servicePath()), - exec.Command("cp", cliBinaryPath, path.Join(constants.DaemonInstallDir, daemon.name)), - exec.Command("mkdir", "-p", daemonStorageDir), - exec.Command("mkdir", "-p", logDir), - - exec.Command("launchctl", "load", daemon.servicePath()), - ) - if err != nil { - return err - } - } - - return nil -} - -func (daemon *darwinRecord) Remove() error { - - if !daemon.IsInstalled() { - return ErrNotInstalled - } - - if daemon.checkRunning() { - err := sudoCommands( - exec.Command("launchctl", "unload", daemon.servicePath()), - ) - if err != nil { - return err - } - } - - daemonStorageDir := filepath.Dir(constants.DaemonStorageFilePath) - - { - err := sudoCommands( - exec.Command("rm", "-f", daemon.servicePath()), - exec.Command("rm", "-f", path.Join(constants.DaemonInstallDir, daemon.name)), - exec.Command("rm", "-rf", daemonStorageDir), - ) - if err != nil { - return err - } - } - - return nil -} - -func (daemon *darwinRecord) IsInstalled() bool { - if _, err := os.Stat(daemon.servicePath()); err != nil { - return false - } - - return daemon.checkRunning() -} - -func (daemon *darwinRecord) checkRunning() bool { - output, err := exec.Command("sudo", "launchctl", "list", daemon.name).Output() - if err == nil { - if matched, err := regexp.MatchString(daemon.name, string(output)); err == nil && matched { - reg := regexp.MustCompile("PID\" = ([0-9]+);") - data := reg.FindStringSubmatch(string(output)) - if len(data) > 1 { - return true - } - return true - } - } - - return false -} - -func (daemon *darwinRecord) servicePath() string { - return "/Library/LaunchDaemons/" + daemon.name + ".plist" -} - -var propertyList = ` - - - - KeepAlive - - Label - {{.Name}} - ProgramArguments - - {{.BinaryPath}} - daemon - run - - RunAtLoad - - WorkingDirectory - {{.WorkingDir}} - StandardErrorPath - {{.LogFile}} - StandardOutPath - {{.LogFile}} - EnvironmentVariables - - PATH - {{.PathEnv}} - HOME - /etc - - - -` diff --git a/src/daemonInstaller/handler_linux.go b/src/daemonInstaller/handler_linux.go deleted file mode 100644 index e6dd6d77..00000000 --- a/src/daemonInstaller/handler_linux.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build linux -// +build linux - -package daemonInstaller - -import ( - "errors" - "os" -) - -func newDaemon(name, description string, dependencies []string) (daemon, error) { - - if _, err := os.Stat("/run/systemd/system"); err == nil { - return &systemDRecord{ - name: name, - description: description, - dependencies: dependencies, - }, nil - } - return nil, errors.New("systemd is not installed") -} diff --git a/src/daemonInstaller/handler_linux_systemd.go b/src/daemonInstaller/handler_linux_systemd.go deleted file mode 100644 index 3e3b5e1c..00000000 --- a/src/daemonInstaller/handler_linux_systemd.go +++ /dev/null @@ -1,184 +0,0 @@ -//go:build linux - -package daemonInstaller - -import ( - _ "embed" - "errors" - "os" - "os/exec" - "path" - "path/filepath" - "regexp" - "strings" - "text/template" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/vpn" -) - -type systemDRecord struct { - name string - description string - dependencies []string -} - -func (daemon *systemDRecord) Install() error { - if daemon.IsInstalled() { - return ErrAlreadyInstalled - } - - _, err := exec.LookPath("wg") - if err != nil { - return errors.New(i18n.DaemonInstallWireguardNotFound) - } - - tmpServiceFilePath := path.Join(os.TempDir(), daemon.serviceName()) - file, err := os.Create(tmpServiceFilePath) - if err != nil { - return err - } - defer file.Close() - - tmpl, err := template.New("systemdConfig").Parse(systemdConfig) - if err != nil { - return err - } - - // create read writes paths - logDir := filepath.Dir(constants.LogFilePath) - daemonStorageDir := filepath.Dir(constants.DaemonStorageFilePath) - readWritePaths := []string{ - logDir, - daemonStorageDir, - } - - dnsManagement, err := vpn.DnsDetect() - if err != nil { - return err - } - if dnsManagement == daemonStorage.LocalDnsManagementResolveConf { - dir := filepath.Dir(constants.ResolvconfOrderFilePath) - readWritePaths = append(readWritePaths, dir) - readWritePaths = append(readWritePaths, "/run/resolvconf/") - } - if dnsManagement == daemonStorage.LocalDnsManagementFile { - dir := filepath.Dir(constants.ResolvFilePath) - readWritePaths = append(readWritePaths, dir) - } - - runtimeDirectoryName := path.Base(path.Dir(constants.DaemonAddress)) - - if err := tmpl.Execute( - file, - &struct { - BinaryPath string - Description string - Dependencies string - LogDir string - RuntimeDirectoryName string - ReadWritePaths []string - }{ - BinaryPath: path.Join(constants.DaemonInstallDir, daemon.name), - Description: daemon.description, - Dependencies: strings.Join(daemon.dependencies, " "), - RuntimeDirectoryName: runtimeDirectoryName, - ReadWritePaths: readWritePaths, - }, - ); err != nil { - return err - } - - binaryPath, err := os.Executable() - if err != nil { - return err - } - - { - err := sudoCommands( - exec.Command("cp", tmpServiceFilePath, daemon.servicePath()), - exec.Command("rm", tmpServiceFilePath), - exec.Command("cp", binaryPath, path.Join(constants.DaemonInstallDir, daemon.name)), - exec.Command("mkdir", "-p", daemonStorageDir), - exec.Command("mkdir", "-p", logDir), - exec.Command("systemctl", "daemon-reload"), - exec.Command("systemctl", "enable", daemon.serviceName()), - exec.Command("systemctl", "start", daemon.serviceName()), - ) - if err != nil { - return err - } - } - - return nil -} - -func (daemon *systemDRecord) Remove() error { - if !daemon.IsInstalled() { - return ErrNotInstalled - } - - if daemon.checkRunning() { - err := sudoCommands( - exec.Command("systemctl", "stop", daemon.serviceName()), - exec.Command("systemctl", "disable", daemon.serviceName()), - ) - if err != nil { - return err - } - } - - logDir := filepath.Dir(constants.LogFilePath) - DaemonStorageDir := filepath.Dir(constants.DaemonStorageFilePath) - - { - err := sudoCommands( - exec.Command("rm", "-f", daemon.servicePath()), - exec.Command("rm", "-f", path.Join(constants.DaemonInstallDir, daemon.name)), - exec.Command("rm", "-rf", DaemonStorageDir), - exec.Command("rm", "-rf", logDir), - ) - if err != nil { - return err - } - } - - return nil -} - -func (daemon *systemDRecord) IsInstalled() bool { - if _, err := os.Stat(daemon.servicePath()); err != nil { - return false - } - err := exec.Command("systemctl", "check", daemon.name).Run() - return err == nil -} - -func (daemon *systemDRecord) serviceName() string { - return daemon.name + ".service" -} - -func (daemon *systemDRecord) servicePath() string { - return "/etc/systemd/system/" + daemon.serviceName() -} - -func (daemon *systemDRecord) checkRunning() bool { - output, err := exec.Command("sudo", "systemctl", "status", daemon.serviceName()).Output() - if err == nil { - if matched, err := regexp.MatchString("Active: active", string(output)); err == nil && matched { - reg := regexp.MustCompile("Main PID: ([0-9]+)") - data := reg.FindStringSubmatch(string(output)) - if len(data) > 1 { - return true - } - return true - } - } - - return false -} - -//go:embed templates/systemd.service.tmpl -var systemdConfig string diff --git a/src/daemonInstaller/handler_windows.go b/src/daemonInstaller/handler_windows.go deleted file mode 100644 index 44893774..00000000 --- a/src/daemonInstaller/handler_windows.go +++ /dev/null @@ -1,163 +0,0 @@ -//go:build windows -// +build windows - -package daemonInstaller - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "strings" - "syscall" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils" - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/mgr" -) - -type windowsRecord struct { - name string - description string - dependencies []string -} - -func newDaemon(name, description string, dependencies []string) (daemon, error) { - return &windowsRecord{ - name: name, - description: description, - dependencies: dependencies, - }, nil -} - -const errnoServiceAlreadyExists = syscall.Errno(1073) - -func (daemon *windowsRecord) Install() error { - exists, err := utils.FileExists(filepath.Join(constants.WireguardPath, "wireguard.exe")) - if err != nil || !exists { - return errors.New(i18n.DaemonInstallWireguardNotFound) - } - - err = checkAndRunAsAdmin() - if err != nil { - return err - } - - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - - binaryPath, err := os.Executable() - if err != nil { - return err - } - - ser, err := m.CreateService(daemon.name, binaryPath, mgr.Config{ - Description: daemon.description, - DisplayName: "zerops daemon", - StartType: mgr.StartAutomatic, - ServiceStartName: ".\\LocalSystem", - ErrorControl: mgr.ErrorNormal, - }, "daemon", "run") - - if errors.Is(err, errnoServiceAlreadyExists) { - ser, err = m.OpenService(daemon.name) - } - - if err != nil { - return err - } - defer ser.Close() - - return ser.Start() -} - -func (daemon *windowsRecord) Remove() error { - if !daemon.IsInstalled() { - return ErrNotInstalled - } - - err := checkAndRunAsAdmin() - if err != nil { - return err - } - - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - - ser, err := m.OpenService(daemon.name) - if err != nil { - return err - } - defer ser.Close() - - ser.Control(svc.Stop) - return ser.Delete() -} - -func (daemon *windowsRecord) IsInstalled() bool { - h, err := windows.OpenSCManager(nil, nil, windows.SC_MANAGER_CONNECT) - if err != nil { - return false - } - defer windows.Close(h) - - if err != nil { - return false - } - serviceName, err := syscall.UTF16PtrFromString(daemon.name) - if err != nil { - return false - } - ser, err := windows.OpenService(h, serviceName, windows.SERVICE_QUERY_STATUS) - if err != nil { - return false - } - defer windows.CloseServiceHandle(ser) - return true -} - -func checkAndRunAsAdmin() error { - if !runsUnderAdmin() { - err := runAsAdmin() - if err != nil { - return err - } - fmt.Println(i18n.DaemonElevated) - return ErrElevatedPrivileges - } - return nil -} - -func runAsAdmin() error { - verb := "runas" - exe, _ := os.Executable() - cwd, _ := os.Getwd() - args := strings.Join(append([]string{"/k", exe}, os.Args[1:]...), " ") - exe = "cmd.exe" - - verbPtr, _ := syscall.UTF16PtrFromString(verb) - exePtr, _ := syscall.UTF16PtrFromString(exe) - cwdPtr, _ := syscall.UTF16PtrFromString(cwd) - argPtr, _ := syscall.UTF16PtrFromString(args) - - var showCmd int32 = 1 //SW_NORMAL - - err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd) - return err -} -func runsUnderAdmin() bool { - _, err := os.Open("\\\\.\\PHYSICALDRIVE0") - if err != nil { - return false - } - return true -} diff --git a/src/daemonInstaller/templates/systemd.service.tmpl b/src/daemonInstaller/templates/systemd.service.tmpl deleted file mode 100644 index 643ea59b..00000000 --- a/src/daemonInstaller/templates/systemd.service.tmpl +++ /dev/null @@ -1,31 +0,0 @@ -[Unit] -Description={{.Description}} -Requires={{.Dependencies}} -After={{.Dependencies}} - -[Service] -ExecStart={{.BinaryPath}} daemon run -ExecReload=/bin/kill -HUP $MAINPID -Restart=on-failure -User=root -Group=root -RestartSec=3 - -# Hardening -ProtectSystem=strict -ProtectKernelTunables=yes -ProtectControlGroups=yes -ProtectHome=yes -ProtectKernelModules=yes -PrivateTmp=yes -RestrictRealtime=yes -RestrictNamespaces=yes - -{{ range .ReadWritePaths -}} -ReadWritePaths={{ . }} -{{ end -}} -RuntimeDirectory={{.RuntimeDirectoryName}} -RuntimeDirectoryMode=0775 - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/src/daemonServer/handler.go b/src/daemonServer/handler.go deleted file mode 100644 index 97674b02..00000000 --- a/src/daemonServer/handler.go +++ /dev/null @@ -1,111 +0,0 @@ -package daemonServer - -import ( - "context" - "errors" - "fmt" - "net" - "net/url" - "os" - "path/filepath" - "time" - - "github.com/zeropsio/zcli/src/proto/daemon" - "github.com/zeropsio/zcli/src/vpn" - "google.golang.org/grpc" -) - -type Config struct { - Socket string - Address string -} - -type Handler struct { - daemon.UnimplementedZeropsDaemonProtocolServer - - config Config - vpn *vpn.Handler -} - -func New(config Config, vpn *vpn.Handler) *Handler { - return &Handler{ - config: config, - vpn: vpn, - } -} - -func (h *Handler) Run(ctx context.Context) error { - address, err := url.Parse(h.config.Socket) - if err != nil { - return err - } - - err = removeUnusedServerSocket(address) - if err != nil { - return err - } - - var lis net.Listener - if h.config.Socket != "" { - lis, err = net.Listen("unix", h.config.Socket) - if err != nil { - return errors.New(fmt.Sprintf("failed to listen: %v", err)) - } - if err := os.Chmod(h.config.Socket, 0666); err != nil { - return errors.New(fmt.Sprintf("failed to chmod: %v", err)) - } - - } else if h.config.Address != "" { - lis, err = net.Listen("tcp", h.config.Address) - if err != nil { - return errors.New(fmt.Sprintf("failed to listen: %v", err)) - } - } - - var opts []grpc.ServerOption - grpcServer := grpc.NewServer(opts...) - daemon.RegisterZeropsDaemonProtocolServer(grpcServer, h) - - go func() { - grpcServer.Serve(lis) - }() - - <-ctx.Done() - - err = lis.Close() - if err != nil { - return errors.New(fmt.Sprintf("failed to close listen: %v", err)) - } - - grpcServer.GracefulStop() - - return nil -} - -func removeUnusedServerSocket(address *url.URL) error { - - socketDir := filepath.Dir(address.Path) - if err := os.MkdirAll(socketDir, 0755); err != nil { - return fmt.Errorf("unable to create socket directory (%s)", socketDir) - } - - if err := os.Chmod(socketDir, 0755); err != nil { - return fmt.Errorf("unable to change socket directory (%s) permissions", socketDir) - } - - if _, errFound := os.Stat(address.Path); errFound != nil { - return nil - } - - conn, err := net.DialTimeout("unix", address.Path, 1*time.Second) - if serverIsRunning := err == nil; serverIsRunning { - defer func() { _ = conn.Close() }() - return fmt.Errorf("socket %s already in use", address.String()) - } - - _ = os.Remove(address.Path) - if _, errFound := os.Stat(address.Path); errFound == nil { - return fmt.Errorf("unused socket %s can't be deleted", address.String()) - } - return nil -} diff --git a/src/daemonServer/handler_startVpn.go b/src/daemonServer/handler_startVpn.go deleted file mode 100644 index 8e529851..00000000 --- a/src/daemonServer/handler_startVpn.go +++ /dev/null @@ -1,27 +0,0 @@ -package daemonServer - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/daemon" -) - -func (h *Handler) StartVpn(ctx context.Context, request *daemon.StartVpnRequest) (*daemon.VpnStatus, error) { - - if err := h.vpn.StartVpn( - ctx, - request.GetApiAddress(), - request.GetVpnAddress(), - request.GetToken(), - request.GetProjectId(), - request.GetUserId(), - request.GetMtu(), - request.GetCaCertificateUrl(), - request.GetPreferredPortMin(), - request.GetPreferredPortMax(), - ); err != nil { - return nil, err - } - - return h.StatusVpn(ctx, &daemon.StatusVpnRequest{}) -} diff --git a/src/daemonServer/handler_statusVpn.go b/src/daemonServer/handler_statusVpn.go deleted file mode 100644 index c75d627b..00000000 --- a/src/daemonServer/handler_statusVpn.go +++ /dev/null @@ -1,11 +0,0 @@ -package daemonServer - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/daemon" -) - -func (h *Handler) StatusVpn(ctx context.Context, _ *daemon.StatusVpnRequest) (*daemon.VpnStatus, error) { - return h.vpn.StatusVpn(ctx) -} diff --git a/src/daemonServer/handler_stopVpn.go b/src/daemonServer/handler_stopVpn.go deleted file mode 100644 index 9c44f33a..00000000 --- a/src/daemonServer/handler_stopVpn.go +++ /dev/null @@ -1,14 +0,0 @@ -package daemonServer - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/daemon" -) - -func (h *Handler) StopVpn(ctx context.Context, _ *daemon.StopVpnRequest) (*daemon.VpnStatus, error) { - if err := h.vpn.StopVpn(ctx); err != nil { - return nil, err - } - return h.vpn.StatusVpn(ctx) -} diff --git a/src/daemonStorage/handler.go b/src/daemonStorage/handler.go deleted file mode 100644 index 7cd8536e..00000000 --- a/src/daemonStorage/handler.go +++ /dev/null @@ -1,46 +0,0 @@ -package daemonStorage - -import ( - "net" - "time" - - "github.com/zeropsio/zcli/src/utils/storage" -) - -type Handler struct { - *storage.Handler[Data] -} - -type LocalDnsManagement string - -const ( - LocalDnsManagementSystemdResolve LocalDnsManagement = "SYSTEMD_RESOLVE" - LocalDnsManagementResolveConf LocalDnsManagement = "RESOLVCONF" - LocalDnsManagementFile LocalDnsManagement = "FILE" - LocalDnsManagementNetworkSetup LocalDnsManagement = "NETWORKSETUP" - LocalDnsManagementUnknown LocalDnsManagement = "UNKNOWN" - LocalDnsManagementWindows LocalDnsManagement = "WINDOWS" -) - -type Data struct { - ProjectId string - UserId string - VpnNetwork net.IPNet - GrpcApiAddress string - GrpcVpnAddress string - GrpcTargetVpnAddress string - CaCertificateUrl string - Token string - PreferredPortMin uint32 - PreferredPortMax uint32 - - ServerIp net.IP - DnsIp net.IP - ClientIp net.IP - Mtu uint32 - DnsManagement LocalDnsManagement - - InterfaceName string - - Expiry time.Time -} diff --git a/src/entity/appVersion.go b/src/entity/appVersion.go new file mode 100644 index 00000000..3402bdd5 --- /dev/null +++ b/src/entity/appVersion.go @@ -0,0 +1,36 @@ +package entity + +import ( + "github.com/zeropsio/zerops-go/dto/output" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/stringId" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type AppVersion struct { + Id uuid.AppVersionId + ClientId uuid.ClientId + ProjectId uuid.ProjectId + ServiceId uuid.ServiceStackId + Source enum.AppVersionSourceEnum + Sequence types.Int + Status enum.AppVersionStatusEnum + Created types.DateTime + LastUpdate types.DateTime + Build *output.AppVersionBuild +} + +type AppVersionBuild struct { + ServiceStackId uuid.ServiceStackIdNull + ServiceStackName types.StringNull + ServiceStackTypeVersionId stringId.ServiceStackTypeVersionIdNull + PipelineStart types.DateTimeNull + PipelineFinish types.DateTimeNull + PipelineFailed types.DateTimeNull + ContainerCreationStart types.DateTimeNull + StartDate types.DateTimeNull + EndDate types.DateTimeNull + CacheUsed types.Bool + HasCurrentCache types.Bool +} diff --git a/src/entity/container.go b/src/entity/container.go new file mode 100644 index 00000000..44ff4964 --- /dev/null +++ b/src/entity/container.go @@ -0,0 +1,19 @@ +package entity + +import ( + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type Container struct { + ID uuid.ContainerId + ClientId uuid.ClientId + ProjectId uuid.ProjectId + ServiceId uuid.ServiceStackId + Status enum.ContainerStatusEnum + Number types.Int + Name types.StringNull + Hostname types.StringNull + Created types.DateTime +} diff --git a/src/entity/project.go b/src/entity/project.go new file mode 100644 index 00000000..f5d39c37 --- /dev/null +++ b/src/entity/project.go @@ -0,0 +1,15 @@ +package entity + +import ( + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type Project struct { + ID uuid.ProjectId + Name types.String + ClientId uuid.ClientId + Description types.Text + Status enum.ProjectStatusEnum +} diff --git a/src/entity/repository/appVersion.go b/src/entity/repository/appVersion.go new file mode 100644 index 00000000..3b17191e --- /dev/null +++ b/src/entity/repository/appVersion.go @@ -0,0 +1,113 @@ +package repository + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/output" + "github.com/zeropsio/zerops-go/types" +) + +func GetAllAppVersionByService( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service entity.Service, +) ([]entity.AppVersion, error) { + + var searchData []body.EsSearchItem + searchData = append(searchData, body.EsSearchItem{ + Name: "clientId", + Operator: "eq", + Value: service.ClientId.TypedString(), + }, body.EsSearchItem{ + Name: "serviceStackId", + Operator: "eq", + Value: service.ID.TypedString(), + }, body.EsSearchItem{ + Name: "build.serviceStackId", + Operator: "ne", + Value: "", + }) + + response, err := restApiClient.PostAppVersionSearch(ctx, body.EsFilter{ + Search: searchData, + }) + if err != nil { + return nil, err + } + + resOutput, err := response.Output() + if err != nil { + return nil, err + } + + appVersions := make([]entity.AppVersion, 0, len(resOutput.Items)) + for _, appVersion := range resOutput.Items { + appVersions = append(appVersions, appVersionFromEsSearch(appVersion)) + } + + return appVersions, nil +} + +func GetLatestAppVersionByService( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service entity.Service, +) ([]entity.AppVersion, error) { + var searchData []body.EsSearchItem + searchData = append(searchData, body.EsSearchItem{ + Name: "clientId", + Operator: "eq", + Value: service.ClientId.TypedString(), + }, body.EsSearchItem{ + Name: "serviceStackId", + Operator: "eq", + Value: service.ID.TypedString(), + }, body.EsSearchItem{ + Name: "build.serviceStackId", + Operator: "ne", + Value: "", + }) + var sortData []body.EsSortItem + sortData = append(sortData, body.EsSortItem{ + Name: "sequence", + Ascending: types.NewBoolNull(false), + }) + + response, err := restApiClient.PostAppVersionSearch(ctx, body.EsFilter{ + Search: searchData, + Sort: sortData, + Limit: types.NewIntNull(1), + }) + if err != nil { + return nil, err + } + resOutput, err := response.Output() + if err != nil { + return nil, err + } + + appVersions := make([]entity.AppVersion, 0, len(resOutput.Items)) + for _, appVersion := range resOutput.Items { + appVersions = append(appVersions, appVersionFromEsSearch(appVersion)) + } + + return appVersions, nil +} + +func appVersionFromEsSearch(esAppVersion output.EsAppVersion) entity.AppVersion { + return entity.AppVersion{ + Id: esAppVersion.Id, + ClientId: esAppVersion.ClientId, + ProjectId: esAppVersion.ProjectId, + ServiceId: esAppVersion.ServiceStackId, + Source: esAppVersion.Source, + Sequence: esAppVersion.Sequence, + Status: esAppVersion.Status, + Created: esAppVersion.Created, + LastUpdate: esAppVersion.LastUpdate, + Build: esAppVersion.Build, + } +} diff --git a/src/entity/repository/container.go b/src/entity/repository/container.go new file mode 100644 index 00000000..2f8e5bdc --- /dev/null +++ b/src/entity/repository/container.go @@ -0,0 +1,61 @@ +package repository + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/output" +) + +func GetAllContainers( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service entity.Service, +) ([]entity.Container, error) { + var searchData []body.EsSearchItem + searchData = append(searchData, body.EsSearchItem{ + Name: "clientId", + Operator: "eq", + Value: service.ClientId.TypedString(), + }, body.EsSearchItem{ + Name: "serviceStackId", + Operator: "eq", + Value: service.ID.TypedString(), + }) + + response, err := restApiClient.PostContainerSearch(ctx, body.EsFilter{ + Search: searchData, + }) + if err != nil { + return nil, err + } + + resOutput, err := response.Output() + if err != nil { + return nil, err + } + + containers := make([]entity.Container, 0, len(resOutput.Items)) + for _, container := range resOutput.Items { + containers = append(containers, containerFromEsSearch(container)) + } + + return containers, nil +} + +func containerFromEsSearch(esContainer output.EsContainer) entity.Container { + + return entity.Container{ + ID: esContainer.Id, + ClientId: esContainer.ClientId, + ProjectId: esContainer.ProjectId, + ServiceId: esContainer.ServiceStackId, + Status: esContainer.Status, + Number: esContainer.Number, + Name: esContainer.Name, + Hostname: esContainer.Hostname, + Created: esContainer.Created, + } +} diff --git a/src/entity/repository/project.go b/src/entity/repository/project.go new file mode 100644 index 00000000..0d2b4ff4 --- /dev/null +++ b/src/entity/repository/project.go @@ -0,0 +1,100 @@ +package repository + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/dto/output" + "github.com/zeropsio/zerops-go/errorCode" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func GetProjectById( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + projectId uuid.ProjectId, +) (*entity.Project, error) { + projectResponse, err := restApiClient.GetProject(ctx, path.ProjectId{Id: projectId}) + if err != nil { + return nil, err + } + + projectOutput, err := projectResponse.Output() + if err != nil { + return nil, zeropsRestApiClient.CheckError( + err, + zeropsRestApiClient.CheckInvalidUserInput( + "id", + errorsx.NewUserError(i18n.T(i18n.ProjectIdInvalidFormat), err), + ), + zeropsRestApiClient.CheckErrorCode( + errorCode.ProjectNotFound, + errorsx.NewUserError(i18n.T(i18n.ProjectNotFound, projectId), err), + ), + ) + } + + project := projectFromApiOutput(projectOutput) + return &project, nil +} + +func GetAllProjects( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, +) ([]entity.Project, error) { + info, err := restApiClient.GetUserInfo(ctx) + if err != nil { + return nil, err + } + + i, err := info.Output() + if err != nil { + return nil, err + } + + var projects []entity.Project + for _, b := range i.ClientUserList { + response, err := restApiClient.GetProjectsByClient(ctx, b.ClientId) + if err != nil { + return nil, err + } + projectsResponse, err := response.Output() + if err != nil { + return nil, err + } + + for _, project := range projectsResponse.Items { + projects = append(projects, projectFromEsSearch(project)) + } + } + + return projects, nil +} + +func projectFromEsSearch(esProject zeropsRestApiClient.EsProject) entity.Project { + description, _ := esProject.Description.Get() + + return entity.Project{ + ID: esProject.Id, + Name: esProject.Name, + ClientId: esProject.ClientId, + Description: description, + Status: esProject.Status, + } +} + +func projectFromApiOutput(project output.Project) entity.Project { + description, _ := project.Description.Get() + + return entity.Project{ + ID: project.Id, + Name: project.Name, + ClientId: project.ClientId, + Description: description, + Status: project.Status, + } +} diff --git a/src/entity/repository/service.go b/src/entity/repository/service.go new file mode 100644 index 00000000..158b001f --- /dev/null +++ b/src/entity/repository/service.go @@ -0,0 +1,143 @@ +package repository + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/dto/output" + "github.com/zeropsio/zerops-go/errorCode" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func GetServiceByIdOrName( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + projectId uuid.ProjectId, + serviceIdOrName string, +) (*entity.Service, error) { + service, err := GetServiceById(ctx, restApiClient, uuid.ServiceStackId(serviceIdOrName)) + if err != nil { + if errorsx.IsUserError(err) { + service, err = GetServiceByName(ctx, restApiClient, projectId, types.String(serviceIdOrName)) + if err != nil { + return nil, err + } + } + } + + return service, err +} + +func GetServiceById( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + serviceId uuid.ServiceStackId, +) (*entity.Service, error) { + serviceResponse, err := restApiClient.GetServiceStack(ctx, path.ServiceStackId{Id: serviceId}) + if err != nil { + return nil, err + } + + serviceOutput, err := serviceResponse.Output() + if err != nil { + return nil, zeropsRestApiClient.CheckError( + err, + zeropsRestApiClient.CheckInvalidUserInput( + "id", + errorsx.NewUserError(i18n.T(i18n.ServiceIdInvalidFormat), err), + ), + zeropsRestApiClient.CheckErrorCode( + errorCode.ServiceStackNotFound, + errorsx.NewUserError(i18n.T(i18n.ServiceNotFound, serviceId), err), + ), + ) + } + + service := serviceFromApiOutput(serviceOutput) + return &service, nil +} + +func GetServiceByName( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + projectId uuid.ProjectId, + serviceName types.String, +) (*entity.Service, error) { + serviceResponse, err := restApiClient.GetServiceStackByName(ctx, path.GetServiceStackByName{ + ProjectId: projectId, + Name: serviceName, + }) + if err != nil { + return nil, err + } + + serviceOutput, err := serviceResponse.Output() + if err != nil { + return nil, zeropsRestApiClient.CheckError( + err, + zeropsRestApiClient.CheckInvalidUserInput( + "id", + errorsx.NewUserError(i18n.T(i18n.ServiceIdInvalidFormat), err), + ), + zeropsRestApiClient.CheckErrorCode( + errorCode.ServiceStackNotFound, + errorsx.NewUserError(i18n.T(i18n.ServiceNotFound, serviceName), err), + ), + ) + } + + service := serviceFromApiOutput(serviceOutput) + return &service, nil +} + +func GetNonSystemServicesByProject( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + project entity.Project, +) ([]entity.Service, error) { + servicesResponse, err := restApiClient.GetServiceStackByProject(ctx, project.ID, project.ClientId) + if err != nil { + return nil, err + } + + servicesOutput, err := servicesResponse.Output() + if err != nil { + return nil, err + } + + services := make([]entity.Service, 0, len(servicesOutput.Items)) + for _, service := range servicesOutput.Items { + if !service.IsSystem { + services = append(services, serviceFromEsSearch(service)) + } + } + + return services, nil +} + +func serviceFromEsSearch(esServiceStack zeropsRestApiClient.EsServiceStack) entity.Service { + return entity.Service{ + ID: esServiceStack.Id, + ClientId: esServiceStack.ClientId, + Name: esServiceStack.Name, + Status: esServiceStack.Status, + ServiceTypeId: esServiceStack.ServiceStackTypeId, + ServiceTypeCategory: esServiceStack.ServiceStackTypeInfo.ServiceStackTypeCategory, + } +} + +func serviceFromApiOutput(service output.ServiceStack) entity.Service { + return entity.Service{ + ID: service.Id, + ClientId: service.Project.ClientId, + Name: service.Name, + Status: service.Status, + ServiceTypeId: service.ServiceStackTypeId, + ServiceTypeCategory: service.ServiceStackTypeInfo.ServiceStackTypeCategory, + } +} diff --git a/src/entity/service.go b/src/entity/service.go new file mode 100644 index 00000000..1fcf53d2 --- /dev/null +++ b/src/entity/service.go @@ -0,0 +1,17 @@ +package entity + +import ( + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/stringId" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type Service struct { + ID uuid.ServiceStackId + ClientId uuid.ClientId + Name types.String + Status enum.ServiceStackStatusEnum + ServiceTypeId stringId.ServiceStackTypeId + ServiceTypeCategory enum.ServiceStackTypeCategoryEnum +} diff --git a/src/errorsx/errors.go b/src/errorsx/errors.go new file mode 100644 index 00000000..e9ab2f99 --- /dev/null +++ b/src/errorsx/errors.go @@ -0,0 +1,45 @@ +package errorsx + +import ( + "github.com/pkg/errors" +) + +type UserError struct { + message string + previous error +} + +func NewUserError(message string, previous error) *UserError { + return &UserError{ + message: message, + previous: previous, + } +} + +func IsUserError(err error) bool { + return AsUserError(err) != nil +} + +func AsUserError(err error) *UserError { + var userError *UserError + if errors.As(err, &userError) { + return userError + } + return nil +} + +func (e *UserError) Error() string { + return e.message +} + +func (e *UserError) Unwrap() error { + return e.previous +} + +func (e *UserError) Is(target error) bool { + return e.previous == target +} + +func (e *UserError) As(target interface{}) bool { + return errors.As(e.previous, target) +} diff --git a/src/utils/httpClient/handler.go b/src/httpClient/handler.go similarity index 98% rename from src/utils/httpClient/handler.go rename to src/httpClient/handler.go index 1915799b..bb946d64 100644 --- a/src/utils/httpClient/handler.go +++ b/src/httpClient/handler.go @@ -8,7 +8,7 @@ import ( "net/http" "time" - "github.com/zeropsio/zcli/src/utils/uuid" + "github.com/zeropsio/zcli/src/uuid" "github.com/zeropsio/zcli/src/support" ) diff --git a/src/i18n/en.go b/src/i18n/en.go index fdd8ae16..1765756f 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -1,295 +1,257 @@ package i18n -import "fmt" - -const ( +var en = map[string]string{ // help - DisplayHelp = "Displays help for " - GroupHelp = "any command." - DaemonInstallHelp = "the daemon install command." - DaemonRemoveHelp = "the daemon remove command." - DaemonRunHelp = "the daemon run command." - DeployHelp = "the deploy command." - LogShowHelp = "the log show command." - LoginHelp = "the login command." - ProjectStartHelp = "the project start command." - ProjectStopHelp = "the project stop command." - ProjectDeleteHelp = "the project delete command." - ProjectImportHelp = "the project import command." - PushHelp = "the push command." - RegionListHelp = "the region list command." - ServiceStartHelp = "the service start command." - ServiceStopHelp = "the service stop command." - ServiceImportHelp = "the service import command." - ServiceDeleteHelp = "the service delete command." - ServiceLogHelp = "the service log command." - VersionHelp = "the version command." - VpnStartHelp = "the vpn start command." - VpnStopHelp = "the vpn stop command." - VpnStatusHelp = "the vpn status command." - BucketCreateHelp = "the bucket create command." - BucketDeleteHelp = "the bucket delete command." + DisplayHelp: "Displays help for ", + GroupHelp: "any command.", + DeployHelp: "the deploy command.", + LogShowHelp: "the log show command.", + LoginHelp: "the login command.", + ProjectHelp: "the project command.", + ProjectStartHelp: "the project start command.", + ProjectStopHelp: "the project stop command.", + ProjectListHelp: "the project list command.", + ScopeHelp: "the scope command.", + ScopeProjectHelp: "the scope project command.", + ScopeServiceHelp: "the scope project command.", + ScopeResetHelp: "the scope reset command.", + ProjectDeleteHelp: "the project delete command.", + ProjectImportHelp: "the project import command.", + PushHelp: "the push command.", + RegionListHelp: "the region list command.", + ServiceStartHelp: "the service start command.", + ServiceStopHelp: "the service stop command.", + ServiceImportHelp: "the service import command.", + ServiceDeleteHelp: "the service delete command.", + ServiceLogHelp: "the service log command.", + VersionHelp: "the version command.", + BucketCreateHelp: "the bucket create command.", + BucketDeleteHelp: "the bucket delete command.", // cmd short - CmdDeployDesc = "Deploys your application to Zerops." - CmdPushDesc = "Builds your application in Zerops and deploys it." - CmdLogin = "Logs you into Zerops. Use a generated Zerops token or your login e-mail and password." - CmdVpn = "VPN commands group." - CmdVpnStart = "Starts a VPN session." - CmdVpnStop = "Stops the existing VPN session." - CmdVpnStatus = "Shows the status of the VPN session." - CmdLog = "zCLI log commands group." - CmdLogShow = "Shows zCLI logs." - CmdDaemon = "Zerops VPN daemon commands group." - CmdDaemonRun = "Runs Zerops VPN daemon." - CmdDaemonInstall = "Installs Zerops VPN daemon." - CmdDaemonRemove = "Removes Zerops VPN daemon." - CmdVersion = "Shows the current zCLI version." - CmdRegion = "Zerops region commands group." - CmdRegionList = "Lists all Zerops regions." - CmdProject = "Project commands group." - CmdService = "Zerops service commands group." - CmdProjectStart = "Starts the project and the services that were running before the project was stopped." - CmdProjectStop = "Stops the project and all of its services." - CmdProjectDelete = "Deletes the project and all of its services." - CmdProjectImport = "Creates a new project with one or more services." - CmdServiceImport = "Creates one or more Zerops services in an existing project." - CmdServiceStart = "Starts the Zerops service." - CmdServiceStop = "Stops the Zerops service." - CmdServiceDelete = "Deletes the Zerops service." - CmdServiceLog = "Get service runtime or build log to stdout." - CmdBucket = "S3 storage management" - CmdBucketZerops = "Management via Zerops API" - CmdBucketS3 = "Management directly via S3 API" - CmdBucketCreate = "Creates a bucket in an existing object storage." - CmdBucketDelete = "Deletes a bucket from an existing object storage." + CmdDeployDesc: "Deploys your application to Zerops.", + CmdPushDesc: "Builds your application in Zerops and deploys it.", + CmdLogin: "Logs you into Zerops. Use a generated Zerops token or your login e-mail and password.", + CmdStatus: "Status commands group.", + CmdStatusInfo: "Shows the current status of the Zerops CLI.", + CmdStatusShowDebugLogs: "Shows zCLI debug logs.", + CmdVersion: "Shows the current zCLI version.", + CmdRegion: "Zerops region commands group.", + CmdRegionList: "Lists all Zerops regions.", + CmdProject: "Project commands group.", + CmdService: "Zerops service commands group.", + CmdProjectStart: "Starts the project and the services that were running before the project was stopped.", + CmdProjectStop: "Stops the project and all of its services.", + CmdProjectList: "Lists all projects.", + CmdScope: "Scope commands group", + CmdScopeProject: "Sets the scope for project. All commands that require project ID will use the selected one.", + CmdScopeService: "Sets the scope for service. All commands that require service ID will use the selected one.", + CmdScopeReset: "Resets the scope for project and service.", + CmdProjectDelete: "Deletes a project and all of its services.", + CmdProjectImport: "Creates a new project with one or more services.", + CmdServiceImport: "Creates one or more Zerops services in an existing project.", + CmdServiceStart: "Starts the Zerops service.", + CmdServiceStop: "Stops the Zerops service.", + CmdServiceDelete: "Deletes the Zerops service.", + CmdServiceLog: "Get service runtime or build log to stdout.", + CmdBucket: "S3 storage management", + CmdBucketZerops: "Management via Zerops API", + CmdBucketS3: "Management directly via S3 API", + CmdBucketCreate: "Creates a bucket in an existing object storage.", + CmdBucketDelete: "Deletes a bucket from an existing object storage.", // cmd long - ProjectImportLong = "Creates a new project with one or more services according to the definition in the import YAML file." - DeployDescLong = "pathToFileOrDir defines a path to one or more directories and/or files relative to the working\ndirectory. The working directory is by default the current directory and can be changed\nusing the --workingDir flag. zCLI deploys selected directories and/or files to Zerops." - PushDescLong = "The command triggers the build pipeline defined in zerops.yml. Zerops.yml must be in the working\ndirectory. The working directory is by default the current directory and can be changed\nusing the --workingDir flag. zCLI uploads all files and subdirectories of the working\ndirectory to Zerops and starts the build pipeline. Files found in the .gitignore\nfile will be ignored.\n\nIf you just want to deploy your application to Zerops, use the zcli deploy command instead." - // CmdServiceLogFull = "Returns service runtime or build log to stdout with a streaming option. By default, the command returns the last 100 log messages from all service runtime containers and exits. Use --follow flag to continuously pool for new log messages.\n" - CmdServiceLogLong = "Returns service runtime or build log to stdout. By default, the command returns the last 100\nlog messages from all service runtime containers and exits.\n" - ServiceLogAdditional = "\nUse the alone in the command to return log messages from all runtime containers.\nSet @1 to return log messages from the first runtime container only.\nSet @build to return log messages from the last build if available." - VpnStartLong = "Starts a VPN session in the selected Zerops project. You can't be connected to multiple projects\nat the same time. If the previous VPN session is active, it will be stopped automatically\nand a new VPN session will start.\n" + CmdProjectImportLong: "Creates a new project with one or more services according to the definition in the import YAML file.", + DeployDescLong: "pathToFileOrDir defines a path to one or more directories and/or files relative to the working\ndirectory. The working directory is by default the current directory and can be changed\nusing the --workingDir flag. zCLI deploys selected directories and/or files to Zerops.", + PushDescLong: "The command triggers the build pipeline defined in zerops.yml. Zerops.yml must be in the working\ndirectory. The working directory is by default the current directory and can be changed\nusing the --workingDir flag. zCLI uploads all files and subdirectories of the working\ndirectory to Zerops and starts the build pipeline. Files found in the .gitignore\nfile will be ignored.\n\nIf you just want to deploy your application to Zerops, use the zcli deploy command instead.", + CmdServiceLogLong: "Returns service runtime or build log to stdout. By default, the command returns the last 100\nlog messages from all service runtime containers and exits.\n", + ServiceLogAdditional: "\nUse the alone in the command to return log messages from all runtime containers.\nSet @1 to return log messages from the first runtime container only.\nSet @build to return log messages from the last build if available.", // flags description - RegionFlag = "Choose one of Zerops regions. Use the \"zcli region list\" command to list all Zerops regions." - ZeropsLoginFlag = "Your login e-mail. Automatically filled if the ZEROPSLOGIN environment variable exists." - ZeropsPwdFlag = "Your password. Automatically filled if the ZEROPSPASSWORD environment variable exists." - ZeropsTokenFlag = "Zerops token. Automatically filled if the ZEROPSTOKEN environment variable exists." - RegionUrlFlag = "Zerops region file url." - BuildVersionName = "Adds a custom version name. Automatically filled if the VERSIONNAME environment variable exists." - SourceName = "Override zerops.yml service name." - BuildWorkingDir = "Sets a custom working directory. Default working directory is the current directory." - BuildArchiveFilePath = "If set, zCLI creates a tar.gz archive with the application code in the required path relative\nto the working directory. By default, no archive is created." - ZeropsYamlLocation = "Sets a custom path to the zerops.yml file relative to the working directory. By default zCLI\nlooks for zerops.yml in the working directory." - UploadGitFolder = "If set, zCLI the .git folder is also uploaded. By default, the .git folder is ignored." - ClientId = "If you have access to more than one client, you must specify the client ID for which the\nproject is to be created." - ConfirmDelete = "If set, zCLI will not ask for confirmation." - LogLimitFlag = "How many of the most recent log messages will be returned. Allowed interval is <1;1000>.\nDefault value = 100." - LogMinSeverityFlag = "Returns log messages with requested or higher severity. Set either severity number in the interval\n<0;7> or one of following severity codes:\nEMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFORMATIONAL, DEBUG." - LogMsgTypeFlag = "Select either APPLICATION or WEBSERVER log messages to be returned. Default value = APPLICATION." - LogFollowFlag = "If set, zCLI will continuously poll for new log messages. By default, the command will exit\nonce there are no more logs to display. To exit from this mode, use Control-C." - LogFormatFlag = "The format of returned log messages. Following formats are supported: \nFULL: This is the default format. Messages will be returned in the complete Syslog format. \nSHORT: Returns only timestamp and log message.\nJSON: Messages will be returned as one JSON object.\nJSONSTREAM: Messages will be returned as stream of JSON objects." - LogFormatTemplateFlag = "Set a custom log format. Can be used only with --format=FULL.\nExample: --formatTemplate=\"{{.timestamp}} {{.severity}} {{.facility}} {{.message}}\".\nSupports standard GoLang template format and functions." - MtuFlag = "Sets a custom MTU for VPN interface. Default value is 1420." - PreferredPortFlag = "????" + RegionFlag: "Choose one of Zerops regions. Use the \"zcli region list\" command to list all Zerops regions.", + RegionUrlFlag: "Zerops region file url.", + BuildVersionName: "Adds a custom version name. Automatically filled if the VERSIONNAME environment variable exists.", + SourceName: "Override zerops.yml service name.", + BuildWorkingDir: "Sets a custom working directory. Default working directory is the current directory.", + BuildArchiveFilePath: "If set, zCLI creates a tar.gz archive with the application code in the required path relative\nto the working directory. By default, no archive is created.", + ZeropsYamlLocation: "Sets a custom path to the zerops.yml file relative to the working directory. By default zCLI\nlooks for zerops.yml in the working directory.", + UploadGitFolder: "If set, zCLI the .git folder is also uploaded. By default, the .git folder is ignored.", + ClientId: "If you have access to more than one client, you must specify the client ID for which the\nproject is to be created.", + LogLimitFlag: "How many of the most recent log messages will be returned. Allowed interval is <1;1000>.\nDefault value = 100.", + LogMinSeverityFlag: "Returns log messages with requested or higher severity. Set either severity number in the interval\n<0;7> or one of following severity codes:\nEMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFORMATIONAL, DEBUG.", + LogMsgTypeFlag: "Select either APPLICATION or WEBSERVER log messages to be returned. Default value = APPLICATION.", + LogShowBuildFlag: "If set, zCLI will return build log messages instead of runtime log messages.", + LogFollowFlag: "If set, zCLI will continuously poll for new log messages. By default, the command will exit\nonce there are no more logs to display. To exit from this mode, use Control-C.", + LogFormatFlag: "The format of returned log messages. Following formats are supported: \nFULL: This is the default format. Messages will be returned in the complete Syslog format. \nSHORT: Returns only timestamp and log message.\nJSON: Messages will be returned as one JSON object.\nJSONSTREAM: Messages will be returned as stream of JSON objects.", + LogFormatTemplateFlag: "Set a custom log format. Can be used only with --format=FULL.\nExample: --formatTemplate=\"{{.timestamp}} {{.severity}} {{.facility}} {{.message}}\".\nSupports standard GoLang template format and functions.", + QuietModeFlag: "In terminal mode some operations need to be confirmed. 0 = Everything needs to be confirmed, 1 = Non-destructive operations need to be confirmed, 2 = Quiet mode, nothing needs to be confirmed. Default value is 0.", + TerminalFlag: "If enabled provides a rich UI to communicate with a user. Possible values: auto, enabled, disabled. Default value is auto.", + LogFilePathFlag: "Path to a log file. Default value: %s.", // prompt - PromptEnterZeropsServiceName = "Enter hostname of zerops service" - PromptName = "name" - PromptInvalidInput = "Invalid input." - PromptInvalidHostname = "Name contains invalid characters." + PromptEnterZeropsServiceName: "Enter hostname of zerops service", + PromptName: "name", + PromptInvalidInput: "Invalid input.", + PromptInvalidHostname: "Name contains invalid characters.", // process - ProcessInvalidState = "last command has finished with error, identifier for communication with our support: %s" - ProcessInvalidStateProcess = "process finished with error, identifier for communication with our support:" - QueuedProcesses = "queued processes: " - ProcessStart = "process started" - ProcessEnd = "process finished" + ProcessInvalidState: "last command has finished with error, identifier for communication with our support: %s", + ProcessInvalidStateProcess: "process finished with error, identifier for communication with our support:", + ProcessStart: "process started", + ProcessEnd: "process finished", // archiveClient - ArchClientWorkingDirectory = "working directory: %s" - ArchClientMaxOneTilde = "only one ~(tilde) is allowed" - ArchClientPackingDirectory = "packing directory: %s" - ArchClientPackingFile = "packing file: %s" - ArchClientFileAlreadyExists = "file [%s] already exists" + ArchClientWorkingDirectory: "working directory: %s", + ArchClientMaxOneTilde: "only one ~(tilde) is allowed", + ArchClientPackingDirectory: "packing directory: %s", + ArchClientPackingFile: "packing file: %s", + ArchClientFileAlreadyExists: "file [%s] already exists", // login - LoginParamsMissing = "either login with password or token must be passed" - LoginSuccess = "you are logged in" - LoginVpnClosed = "vpn connection was closed" - RegionUrl = "zerops region file url" + LoginSuccess: "You are logged as %s <%s>", + LoginIncorrectToken: "Incorrect token, login failed", + RegionUrl: "zerops region file url", // region - RegionNotFound = "region not found" + RegionNotFound: "Selected region %s not found", // client ID - MultipleClientIds = "you have assigned multiple client IDs, please use the --clientId flag" - AvailableClientIds = "your client IDs are: " - MissingClientId = "no client ID found four your account" + MultipleClientIds: "you have assigned multiple client IDs, please use the --clientId flag", + AvailableClientIds: "your client IDs are: ", + MissingClientId: "no client ID found four your account", // import - YamlCheck = "yaml file check started" - ImportYamlOk = "yaml file ok" - ImportYamlEmpty = "config file import yaml is empty" - ImportYamlTooLarge = "max. size of import yaml is 100 KB" - ImportYamlFound = "import yaml found" - ImportYamlNotFound = "import yaml not found" - ImportYamlCorrupted = "import yaml corrupted" - ServiceStackCount = "number of services to be added: " - CoreServices = "core services activation started" - ReadyToImportServices = "ready to import services" + YamlCheck: "yaml file check started", + ImportYamlOk: "Yaml file was checked", + ImportYamlEmpty: "Config file import yaml is empty", + ImportYamlTooLarge: "Max. size of import yaml is 100 KB", + ImportYamlFound: "Import yaml found", + ImportYamlNotFound: "Import yaml not found", + ImportYamlCorrupted: "Import yaml corrupted", + ServiceCount: "Number of services to be added: %d", + QueuedProcesses: "Queued processes: %d", + CoreServices: "Core services activation started", + ReadyToImportServices: "Ready to import services", // delete cmd - DeleteCanceledByUser = "delete command canceled by user" + DeleteCanceledByUser: "delete command canceled by user", // project + service - ProjectNotFound = "project not found" - ProjectWrongId = "Please, provide correct project ID." - ProjectsWithSameName = "found multiple projects with the same name" - AvailableProjectIds = "available project IDs are: " - ProjectNameOrIdEmpty = "project name or ID must be filled" - ProjectDeleteConfirm = "Please confirm that you would like to delete the project (y/n): " - ServiceNotFound = "service not found" - ServiceNameIsEmpty = "service name must be filled" - ServiceDeleteConfirm = "Please confirm that you would like to delete the service (y/n): " - ProcessInit = " command initialized" - Success = " successfully" - ProjectStart = "project start" - ProjectStop = "project stop" - ProjectDelete = "project delete" - ProjectStarted = "project started" - ProjectStopped = "project stopped" - ProjectDeleted = "project deleted" - ProjectCreated = "project created" - ServiceStart = "service start" - ServiceStop = "service stop" - ServiceDelete = "service delete" - ServiceStarted = "service started" - ServiceStopped = "service stopped" - ServiceDeleted = "service deleted" - ProjectImported = "project imported" - ServiceImported = "service(s) imported" - LogLimitInvalid = "Invalid --limit value. Allowed interval is <1;1000>" - LogMinSeverityInvalid = "Invalid --minimumSeverity value." - LogMinSeverityStringLimitErr = "Allowed values are EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFORMATIONAL, DEBUG." - LogMinSeverityNumLimitErr = "Allowed interval is <0;7>." - LogFormatInvalid = "Invalid --format value. Allowed values are FULL, SHORT, JSON, JSONSTREAM." - LogFormatTemplateMismatch = "--formatTemplate can be used only in combination with --format=FULL." - LogFormatStreamMismatch = "--format=JSON cannot be used in combination with --follow. Use --format=JSONSTREAM instead." - LogServiceNameInvalid = "Invalid serviceName value. Multiple @ characters are not supported. See -h for help." - LogFormatTemplateInvalid = "Invalid --formatTemplate content. The custom template failed with following error:" - LogFormatTemplateNoSpace = "Template items must be split by a (single) space." - LogSuffixInvalid = "Invalid serviceName value. Use @ to return log messages from the N-th runtime container only.\nUse @BUILD to return log messages from the last build if available." - LogRuntimeOnly = "This command can be used on runtime services only." - LogNoContainerFound = "No runtime container was found." - LogTooFewContainers = "There %s only %d runtime container%s at the moment. Select a lower container index." - LogNoBuildFound = "No build was found for this service." - LogBuildStatusUploading = "Service status UPLOADING, need to wait for app version data." - LogAccessFailed = "Request for access to logs failed." - LogMsgTypeInvalid = "Invalid --messageType value. Allowed values are APPLICATION, WEBSERVER." - LogReadingFailed = "Log reading failed." - - // deploy - DeployHintPush = "To build your application in Zerops, use the zcli push command instead." - BuildDeployServiceStatus = "service status: %s" - BuildDeployCreatingPackageStart = "creating package" - BuildDeployCreatingPackageDone = "package created" - BuildDeployPackageSavedInto = "package file saved into: %s" - BuildDeployUploadingPackageStart = "uploading package" - BuildDeployUploadingPackageDone = "package uploaded" - BuildDeployUploadPackageFailed = "package upload failed" - BuildDeployDeployingStart = "deploying service" - BuildDeployZeropsYamlEmpty = "config file zerops.yml is empty" - BuildDeployZeropsYamlTooLarge = "max. size of zerops.yml is 10 KB" - BuildDeployZeropsYamlFound = "zerops.yml found" - BuildDeployZeropsYamlNotFound = "zerops.yml not found" - BuildDeploySuccess = "service deployed" + ProjectWrongId: "Please, provide correct project ID.", + ProjectsWithSameName: "found multiple projects with the same name", + AvailableProjectIds: "available project IDs are: ", + ProjectNameOrIdEmpty: "project name or ID must be filled", + ProjectDeleteConfirm: "Project %s will be deleted? \n Are you sure?", + ServiceNameIsEmpty: "Service name must be filled", + ServiceDeleteConfirm: "Service %s will be deleted? \n Are you sure?", + ProcessInit: " command initialized", + ProjectStarting: "Project is being started", + ProjectStarted: "Project was started", + ProjectStopping: "Project is begin stopped", + ProjectStopped: "Project was stopped", + ProjectDeleting: "Project is being deleted", + ProjectDeleted: "Project was deleted", + ServiceStarting: "Service is being started", + ServiceStarted: "Service was started", + ServiceStopping: "Service is being stopped", + ServiceStopped: "Service was stopped", + ServiceDeleting: "Service is being deleted", + ServiceDeleted: "Service was deleted", + ProjectImported: "project imported", + ServiceImported: "service(s) imported", + LogLimitInvalid: "Invalid --limit value. Allowed interval is <1;1000>", + LogMinSeverityInvalid: "Invalid --minimumSeverity value.", + LogMinSeverityStringLimitErr: "Allowed values are EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFORMATIONAL, DEBUG.", + LogMinSeverityNumLimitErr: "Allowed interval is <0;7>.", + LogFormatInvalid: "Invalid --format value. Allowed values are FULL, SHORT, JSON, JSONSTREAM.", + LogFormatTemplateMismatch: "--formatTemplate can be used only in combination with --format=FULL.", + LogFormatStreamMismatch: "--format=JSON cannot be used in combination with --follow. Use --format=JSONSTREAM instead.", + LogServiceNameInvalid: "Invalid serviceName value. Multiple @ characters are not supported. See -h for help.", + LogFormatTemplateInvalid: "Invalid --formatTemplate content. The custom template failed with following error:", + LogFormatTemplateNoSpace: "Template items must be split by a (single) space.", + LogSuffixInvalid: "Invalid serviceName value. Use @ to return log messages from the N-th runtime container only.\nUse @BUILD to return log messages from the last build if available.", + LogRuntimeOnly: "This command can be used on runtime services only.", + LogNoContainerFound: "No runtime container was found.", + LogTooFewContainers: "There %s only %d runtime container%s at the moment. Select a lower container index.", + LogNoBuildFound: "No build was found for this service.", + LogBuildStatusUploading: "Service status UPLOADING, need to wait for app version data.", + LogAccessFailed: "Request for access to logs failed.", + LogMsgTypeInvalid: "Invalid --messageType value. Allowed values are APPLICATION, WEBSERVER.", + LogReadingFailed: "Log reading failed.", - // vpn - VpnDaemonUnavailable = "Zerops VPN daemon needs to be installed on your machine to handle VPN connections." + // push + PushRunning: "Push is running", + PushFinished: "Push finished", - // vpn start - VpnStartInstallDaemonPrompt = "Do you want to install the VPN daemon?\nYou will be prompted for your root/administrator password to confirm the installation." - VpnStartTerminatedByUser = "when you are ready, try `/path/to/zcli daemon install`" - VpnStartUserIsUnableToWriteYorN = "type 'y' or 'n' please" - VpnStartWireguardUtunError = "we failed to start vpn, there is a possibility that you have another vpn. If so, try to shut it down" - VpnStartVpnNotReachable = "zerops vpn servers aren't reachable" - VpnStartTunnelIsNotAlive = "we failed to establish zerops vpn" - VpnStartUnableToConfigureNetworkInterface = "unable to configure network interface" - VpnStartUnableToUpdateRoutingTable = "unable to update routing table" - VpnStartNetworkInterfaceNotFound = "network interface not found" - VpnStartInvalidServerPublicKey = "invalid server public key" - VpnStartInvalidVpnAddress = "invalid VPN address" - VpnStartTunnelConfigurationFailed = "tunnel configuration failed" - - // vpn status - VpnStatusTunnelStatusActive = "wireguard tunnel is working properly" - VpnStatusTunnelStatusSetInactive = "wireguard tunnel isn't established, try `/path/to/zcli vpn start` command" - VpnStatusDnsStatusActive = "dns is working properly" - VpnStatusDnsStatusSetInactive = "dns isn't set, try `/path/to/zcli vpn start` command" - VpnStatusAdditionalInfo = "additional info:" - VpnStatusDnsCheckError = "we failed to check that dns is working correctly" - VpnStatusDnsNoCheckFunction = "there is no function for dns check" - VpnStatusDnsInterfaceNotFound = "vpn interface not found" - VpnStatusWireguardNotAvailable = "wireguard interface not available" + // deploy + DeployHintPush: "To build your application in Zerops, use the zcli push command instead.", + BuildDeployServiceStatus: "service status: %s", + BuildDeployCreatingPackageStart: "creating package", + BuildDeployCreatingPackageDone: "package created", + BuildDeployPackageSavedInto: "package file saved into: %s", + BuildDeployUploadingPackageStart: "uploading package", + BuildDeployUploadingPackageDone: "package uploaded", + BuildDeployUploadPackageFailed: "package upload failed", + BuildDeployDeployingStart: "deploying service", + BuildDeployZeropsYamlEmpty: "config file zerops.yml is empty", + BuildDeployZeropsYamlTooLarge: "max. size of zerops.yml is 10 KB", + BuildDeployZeropsYamlFound: "File zerops.yml found. Path: %s.", + BuildDeployZeropsYamlNotFound: "File zerops.yml not found", - // vpn stop - VpnStopSuccess = "vpn connection was closed" - VpnStopAdditionalInfo = "additional info:" - VpnStopAdditionalInfoMessage = "dns could be set by yourself, if so it must be removed manually" - VpnStopUnableToRemoveTunnelInterface = "unable to remove tunnel interface" + // S3 + BucketGenericXAmzAcl: "Defines one of predefined grants, known as canned ACLs.\nValid values are: private, public-read, public-read-write, authenticated-read.", + BucketGenericXAmzAclInvalid: "Invalid --x-amz-acl value. Allowed values are: private, public-read, public-read-write, authenticated-read.", + BucketGenericOnlyForObjectStorage: "This command can be used on object storage services only.", + BucketGenericBucketNamePrefixed: "Bucket names are prefixed by object storage service ID to make the bucket names unique.\nLearn more about bucket naming conventions at https://docs.zerops.io/documentation/services/storage/s3.html#used-technology", - // daemon - DaemonInstallerDesc = "zerops daemon" - DaemonUnableToSaveConfiguration = "unable to save configuration" - DaemonElevated = "operation continues in a new window" - PathNotFound = "path not found" + BucketCreated: "Bucket created", + BucketCreateCreatingDirect: "Creating bucket %s directly on S3 API.", + BucketCreateCreatingZeropsApi: "Creating bucket %s using Zerops API.", - // daemon install - DaemonInstallSuccess = "zerops daemon has been installed" - DaemonInstallWireguardNotFound = "wireguard was not found" - DaemonInstallWireguardNotFoundDarwin = "wireguard was not found, try `brew install wireguard-tools`" + BucketDeleteConfirm: "Bucket %s will be deleted? \n Are you sure?", + BucketDeleted: "Bucket deleted", + BucketDeleteDeletingDirect: "Deleting bucket %s directly on S3 API.", + BucketDeleteDeletingZeropsApi: "Deleting bucket %s using Zerops API.", - // daemon remove - DaemonRemoveStopVpnUnavailable = "zerops daemon isn't running, vpn couldn't be removed" - DaemonRemoveSuccess = "zerops daemon has been removed" + BucketS3AccessKeyId: "When using direct S3 API the accessKeyId to the Zerops object storage is required.\nAutomatically filled if the {serviceName}_accessKeyId environment variable exists.", + BucketS3SecretAccessKey: "When using direct S3 API the secretAccessKey to the Zerops object storage is required.\nAutomatically filled if the {serviceName}_secretAccessKey environment variable exists.", + BucketS3FlagBothMandatory: "If you are specifying accessKeyId or secretAccessKey, both flags are mandatory.", + BucketS3EnvBothMandatory: "If you are using env for accessKeyId or secretAccessKey, both env variables must be set.", + BucketS3RequestFailed: "S3 API request failed: %s", + BucketS3BucketAlreadyExists: "The bucket name already exists under a different object storage user. Set a different bucket name.", - // S3 - BucketGenericXAmzAcl = "Defines one of predefined grants, known as canned ACLs.\nValid values are: private, public-read, public-read-write, authenticated-read." - BucketGenericXAmzAclInvalid = "Invalid --x-amz-acl value. Allowed values are: private, public-read, public-read-write, authenticated-read." - BucketGenericOnlyForObjectStorage = "This command can be used on object storage services only." - BucketGenericBucketNamePrefixed = "Bucket names are prefixed by object storage service ID to make the bucket names unique.\nLearn more about bucket naming conventions at https://docs.zerops.io/documentation/services/storage/s3.html#used-technology" + // Status info + StatusInfoCliDataFilePath: "Zerops CLI data file path", + StatusInfoLogFilePath: "Zerops CLI log file path", - BucketCreated = "Bucket created" - BucketCreateCreatingDirect = "Creating bucket %s directly on S3 API.\n" - BucketCreateCreatingZeropsApi = "Creating bucket %s using Zerops API.\n" + // Logger + LoggerUnableToOpenLogFileWarning: "Failed to open a log file, used path: %s. Try to use --log-file-path flag.\n", - BucketDeleted = "Bucket deleted" - BucketDeleteDeletingDirect = "Deleting bucket %s directly on S3 API.\n" - BucketDeleteDeletingZeropsApi = "Deleting bucket %s using Zerops API.\n" + // generic + UnauthenticatedUser: `unauthenticated user, login before proceeding with this command +zcli login {token} +more info: https://docs.zerops.io/documentation/cli/authorization.html`, - BucketS3Region = "When using direct S3 API choose one of Zerops regions.\nUse the \"zcli region list\" command to list all Zerops regions.\nAutomatically filled if the REGION environment variable exists or the user is logged in." - BucketS3AccessKeyId = "When using direct S3 API the accessKeyId to the Zerops object storage is required.\nAutomatically filled if the {serviceName}_accessKeyId environment variable exists." - BucketS3SecretAccessKey = "When using direct S3 API the secretAccessKey to the Zerops object storage is required.\nAutomatically filled if the {serviceName}_secretAccessKey environment variable exists." - BucketS3FlagBothMandatory = "If you are specifying accessKeyId or secretAccessKey, both flags are mandatory." - BucketS3EnvBothMandatory = "If you are using env for accessKeyId or secretAccessKey, both env variables must be set." - BucketS3RequestFailed = "S3 API request failed: %s" - BucketS3BucketAlreadyExists = "The bucket name already exists under a different object storage user. Set a different bucket name." + HintChangeRegion: "hint: try to change your region (you can list available regions using `zcli region list`)", - // generic - UnauthenticatedUser = `unauthenticated user, login before proceeding with this command -zcli login {token | username password} -more info: https://docs.zerops.io/documentation/cli/authorization.html` + // UX helpers + ProjectSelectorListEmpty: "You don't have any projects yet. Create a new project using `zcli project import` command.", + ProjectSelectorPrompt: "Please, select a project", + ProjectSelectorOutOfRangeError: "We couldn't find a project with the index you entered. Please, try again or contact our support team.", + ServiceSelectorListEmpty: "Project doesn't have any services yet. Create a new service using `zcli service import` command", + ServiceSelectorPrompt: "Please, select a service", + ServiceSelectorOutOfRangeError: "We couldn't find a service with the index you entered. Please, try again or contact our support team.", - GrpcApiTimeout = "zerops api didn't respond within assigned time, try it again later" - GrpcVpnApiTimeout = "zerops vpn server didn't respond within assigned time, try it again later" + // Global + SelectedProject: "Selected project: %s", + SelectedService: "Selected service: %s", + ScopedProject: "Scoped project: %s", + ScopedProjectNotFound: "Scoped project wasn't found, Select a different project using `zcli scope project` command.", + ScopedServiceNotFound: "Scoped service wasn't found, Select a different service using `zcli scope service` command.", - HintChangeRegion = "hint: try to change your region (you can list available regions using `zcli region list`)" -) + ProjectIdInvalidFormat: "Invalid format of project ID. ID must have 22 characters.", + ProjectNotFound: "Project [%s] wasn't found", -func AddHintChangeRegion(err error) error { - return fmt.Errorf("%w\n%s", err, HintChangeRegion) + ServiceIdInvalidFormat: "Invalid format of service ID. ID must have 22 characters.", + ServiceNotFound: "Service [%s] wasn't found", } diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go new file mode 100644 index 00000000..3a9a75ad --- /dev/null +++ b/src/i18n/i18n.go @@ -0,0 +1,268 @@ +package i18n + +import "fmt" + +func T(textConst string, args ...interface{}) string { + translation, exists := en[textConst] + if !exists { + return "[missing translation] " + textConst + } + if len(args) > 0 { + return fmt.Sprintf(translation, args...) + } + return translation +} + +const ( + // help + DisplayHelp = "DisplayHelp" + GroupHelp = "GroupHelp" + DeployHelp = "DeployHelp" + LogShowHelp = "LogShowHelp" + LoginHelp = "LoginHelp" + ProjectHelp = "ProjectHelp" + ProjectStartHelp = "ProjectStartHelp" + ProjectStopHelp = "ProjectStopHelp" + ProjectListHelp = "ProjectListHelp" + ScopeHelp = "ScopeHelp" + ScopeProjectHelp = "ScopeProjectHelp" + ScopeServiceHelp = "ScopeServiceHelp" + ScopeResetHelp = "ScopeResetHelp" + ProjectDeleteHelp = "ProjectDeleteHelp" + ProjectImportHelp = "ProjectImportHelp" + PushHelp = "PushHelp" + RegionListHelp = "RegionListHelp" + ServiceStartHelp = "ServiceStartHelp" + ServiceStopHelp = "ServiceStopHelp" + ServiceImportHelp = "ServiceImportHelp" + ServiceDeleteHelp = "ServiceDeleteHelp" + ServiceLogHelp = "ServiceLogHelp" + VersionHelp = "VersionHelp" + BucketCreateHelp = "BucketCreateHelp" + BucketDeleteHelp = "BucketDeleteHelp" + + // cmd short + CmdDeployDesc = "CmdDeployDesc" + CmdPushDesc = "CmdPushDesc" + CmdLogin = "CmdLogin" + CmdStatus = "CmdStatus" + CmdStatusInfo = "CmdStatusInfo" + CmdStatusShowDebugLogs = "CmdStatusShowDebugLogs" + CmdVersion = "CmdVersion" + CmdRegion = "CmdRegion" + CmdRegionList = "CmdRegionList" + CmdProject = "CmdProject" + CmdService = "CmdService" + CmdProjectStart = "CmdProjectStart" + CmdProjectStop = "CmdProjectStop" + CmdProjectList = "CmdProjectList" + CmdScope = "CmdScope" + CmdScopeProject = "CmdScopeProject" + CmdScopeService = "CmdScopeService" + CmdScopeReset = "CmdScopeReset" + CmdProjectDelete = "CmdProjectDelete" + CmdProjectImport = "CmdProjectImport" + CmdServiceImport = "CmdServiceImport" + CmdServiceStart = "CmdServiceStart" + CmdServiceStop = "CmdServiceStop" + CmdServiceDelete = "CmdServiceDelete" + CmdServiceLog = "CmdServiceLog" + CmdBucket = "CmdBucket" + CmdBucketZerops = "CmdBucketZerops" + CmdBucketS3 = "" + CmdBucketCreate = "CmdBucketCreate" + CmdBucketDelete = "CmdBucketDelete" + + // cmd long + CmdProjectImportLong = "CmdProjectImportLong" + DeployDescLong = "DeployDescLong" + PushDescLong = "PushDescLong" + CmdServiceLogLong = "CmdServiceLogLong" + ServiceLogAdditional = "ServiceLogAdditional" + + // flags description + RegionFlag = "RegionFlag" + RegionUrlFlag = "RegionUrlFlag" + BuildVersionName = "BuildVersionName" + SourceName = "SourceName" + BuildWorkingDir = "BuildWorkingDir" + BuildArchiveFilePath = "BuildArchiveFilePath" + ZeropsYamlLocation = "ZeropsYamlLocation" + UploadGitFolder = "UploadGitFolder" + ClientId = "ClientId" + LogLimitFlag = "LogLimitFlag" + LogMinSeverityFlag = "LogMinSeverityFlag" + LogMsgTypeFlag = "LogMsgTypeFlag" + LogFollowFlag = "LogFollowFlag" + LogShowBuildFlag = "LogShowBuildFlag" + LogFormatFlag = "LogFormatFlag" + LogFormatTemplateFlag = "LogFormatTemplateFlag" + QuietModeFlag = "QuietModeFlag" + TerminalFlag = "TerminalFlag" + LogFilePathFlag = "LogFilePathFlag" + + // prompt + PromptEnterZeropsServiceName = "PromptEnterZeropsServiceName" + PromptName = "PromptName" + PromptInvalidInput = "PromptInvalidInput" + PromptInvalidHostname = "PromptInvalidHostname" + + // process + ProcessInvalidState = "ProcessInvalidState" + ProcessInvalidStateProcess = "ProcessInvalidStateProcess" + ProcessStart = "ProcessStart" + ProcessEnd = "ProcessEnd" + + // archiveClient + ArchClientWorkingDirectory = "ArchClientWorkingDirectory" + ArchClientMaxOneTilde = "ArchClientMaxOneTilde" + ArchClientPackingDirectory = "ArchClientPackingDirectory" + ArchClientPackingFile = "ArchClientPackingFile" + ArchClientFileAlreadyExists = "ArchClientFileAlreadyExists" + + // login + LoginSuccess = "LoginSuccess" + LoginIncorrectToken = "LoginIncorrectToken" + RegionUrl = "RegionUrl" + + // region + RegionNotFound = "RegionNotFound" + + // client ID + MultipleClientIds = "MultipleClientIds" + AvailableClientIds = "AvailableClientIds" + MissingClientId = "MissingClientId" + + // import + YamlCheck = "YamlCheck" + ImportYamlOk = "ImportYamlOk" + ImportYamlEmpty = "ImportYamlEmpty" + ImportYamlTooLarge = "ImportYamlTooLarge" + ImportYamlFound = "ImportYamlFound" + ImportYamlNotFound = "ImportYamlNotFound" + ImportYamlCorrupted = "ImportYamlCorrupted" + ServiceCount = "ServiceCount" + QueuedProcesses = "QueuedProcesses" + CoreServices = "CoreServices" + ReadyToImportServices = "ReadyToImportServices" + + // delete cmd + DeleteCanceledByUser = "DeleteCanceledByUser" + + // project + service + ProjectWrongId = "ProjectWrongId" + ProjectsWithSameName = "ProjectsWithSameName" + AvailableProjectIds = "AvailableProjectIds" + ProjectNameOrIdEmpty = "ProjectNameOrIdEmpty" + ProjectDeleteConfirm = "ProjectDeleteConfirm" + ServiceNameIsEmpty = "ServiceNameIsEmpty" + ServiceDeleteConfirm = "ServiceDeleteConfirm" + ProcessInit = "ProcessInit" + ProjectStarting = "ProjectStarting" + ProjectStarted = "ProjectStarted" + ProjectStopping = "ProjectStopping" + ProjectStopped = "ProjectStopped" + ProjectDeleting = "ProjectDeleting" + ProjectDeleted = "ProjectDeleted" + ServiceStarting = "ServiceStarting" + ServiceStarted = "ServiceStarted" + ServiceStopping = "ServiceStopping" + ServiceStopped = "ServiceStopped" + ServiceDeleting = "ServiceDeleting" + ServiceDeleted = "ServiceDeleted" + ProjectImported = "ProjectImported" + ServiceImported = "ServiceImported" + LogLimitInvalid = "LogLimitInvalid" + LogMinSeverityInvalid = "LogMinSeverityInvalid" + LogMinSeverityStringLimitErr = "LogMinSeverityStringLimitErr" + LogMinSeverityNumLimitErr = "LogMinSeverityNumLimitErr" + LogFormatInvalid = "LogFormatInvalid" + LogFormatTemplateMismatch = "LogFormatTemplateMismatch" + LogFormatStreamMismatch = "LogFormatStreamMismatch" + LogServiceNameInvalid = "LogServiceNameInvalid" + LogFormatTemplateInvalid = "LogFormatTemplateInvalid" + LogFormatTemplateNoSpace = "LogFormatTemplateNoSpace" + LogSuffixInvalid = "LogSuffixInvalid" + LogRuntimeOnly = "LogRuntimeOnly" + LogNoContainerFound = "LogNoContainerFound" + LogTooFewContainers = "LogTooFewContainers" + LogNoBuildFound = "LogNoBuildFound" + LogBuildStatusUploading = "LogBuildStatusUploading" + LogAccessFailed = "LogAccessFailed" + LogMsgTypeInvalid = "LogMsgTypeInvalid" + LogReadingFailed = "LogReadingFailed" + + // push + PushRunning = "PushRunning" + PushFinished = "PushFinished" + + // deploy + DeployHintPush = "DeployHintPush" + BuildDeployServiceStatus = "BuildDeployServiceStatus" + BuildDeployCreatingPackageStart = "BuildDeployCreatingPackageStart" + BuildDeployCreatingPackageDone = "BuildDeployCreatingPackageDone" + BuildDeployPackageSavedInto = "BuildDeployPackageSavedInto" + BuildDeployUploadingPackageStart = "BuildDeployUploadingPackageStart" + BuildDeployUploadingPackageDone = "BuildDeployUploadingPackageDone" + BuildDeployUploadPackageFailed = "BuildDeployUploadPackageFailed" + BuildDeployDeployingStart = "BuildDeployDeployingStart" + BuildDeployZeropsYamlEmpty = "BuildDeployZeropsYamlEmpty" + BuildDeployZeropsYamlTooLarge = "BuildDeployZeropsYamlTooLarge" + BuildDeployZeropsYamlFound = "BuildDeployZeropsYamlFound" + BuildDeployZeropsYamlNotFound = "BuildDeployZeropsYamlNotFound" + + // S3 + BucketGenericXAmzAcl = "BucketGenericXAmzAcl" + BucketGenericXAmzAclInvalid = "BucketGenericXAmzAclInvalid" + BucketGenericOnlyForObjectStorage = "BucketGenericOnlyForObjectStorage" + BucketGenericBucketNamePrefixed = "BucketGenericBucketNamePrefixed" + + BucketCreated = "BucketCreated" + BucketCreateCreatingDirect = "BucketCreateCreatingDirect" + BucketCreateCreatingZeropsApi = "BucketCreateCreatingZeropsApi" + + BucketDeleteConfirm = "BucketDeleteConfirm" + BucketDeleted = "BucketDeleted" + BucketDeleteDeletingDirect = "BucketDeleteDeletingDirect" + BucketDeleteDeletingZeropsApi = "BucketDeleteDeletingZeropsApi" + + BucketS3AccessKeyId = "AccessKeyId" + BucketS3SecretAccessKey = "SecretAccessKey" + BucketS3FlagBothMandatory = "FlagBothMandatory" + BucketS3EnvBothMandatory = "EnvBothMandatory" + BucketS3RequestFailed = "RequestFailed" + BucketS3BucketAlreadyExists = "BucketAlreadyExists" + + // Status info + StatusInfoCliDataFilePath = "StatusInfoCliDataFilePath" + StatusInfoLogFilePath = "StatusInfoLogFilePath" + + // Logger + LoggerUnableToOpenLogFileWarning = "LoggerUnableToOpenLogFileWarning" + + // generic + UnauthenticatedUser = "UnauthenticatedUser" + + HintChangeRegion = "HintChangeRegion" + + // UX helpers + ProjectSelectorListEmpty = "ProjectSelectorListEmpty" + ProjectSelectorPrompt = "ProjectSelectorPrompt" + ProjectSelectorOutOfRangeError = "ProjectSelectorOutOfRangeError" + ServiceSelectorListEmpty = "ServiceSelectorListEmpty" + ServiceSelectorPrompt = "ServiceSelectorPrompt" + ServiceSelectorOutOfRangeError = "ServiceSelectorOutOfRangeError" + + // General + SelectedProject = "SelectedProject" + SelectedService = "SelectedService" + ScopedProject = "ScopedProject" + ScopedProjectNotFound = "ScopedProjectNotFound" + ScopedServiceNotFound = "ScopedServiceNotFound" + + ProjectIdInvalidFormat = "ProjectIdInvalidFormat" + ProjectNotFound = "ProjectNotFound" + + ServiceIdInvalidFormat = "ServiceIdInvalidFormat" + ServiceNotFound = "ServiceNotFound" +) diff --git a/src/logger/handler.go b/src/logger/handler.go new file mode 100644 index 00000000..0eab13a3 --- /dev/null +++ b/src/logger/handler.go @@ -0,0 +1,109 @@ +package logger + +import ( + "fmt" + "io" + "os" + + "github.com/zeropsio/zcli/src/i18n" + + "github.com/sirupsen/logrus" +) + +type Config struct { + FilePath string + IsTerminal bool +} + +type Handler struct { + config Config + + logrus *logrus.Logger +} + +type OutputConfig struct { + IsTerminal bool +} + +func NewOutputLogger(config OutputConfig) *Handler { + l := logrus.New() + l.Out = io.Discard + l.Level = logrus.DebugLevel + + var formatter logrus.Formatter + if !config.IsTerminal { + formatter = &logrus.TextFormatter{DisableColors: true} + } + + l.AddHook(&StdoutHook{ + levels: []logrus.Level{logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel}, + formatter: formatter, + }) + + return &Handler{ + logrus: l, + } + +} + +type DebugFileConfig struct { + FilePath string +} + +func NewDebugFileLogger(config DebugFileConfig) *Handler { + l := logrus.New() + l.Out = io.Discard + l.Level = logrus.DebugLevel + + file, err := os.OpenFile(config.FilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0775) + if err != nil { + os.Stdout.WriteString(fmt.Sprintf(i18n.T(i18n.LoggerUnableToOpenLogFileWarning), config.FilePath)) + } else { + file.Close() + + l.AddHook(&VarLogHook{ + path: config.FilePath, + levels: []logrus.Level{logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel}, + formatter: &logrus.TextFormatter{ + DisableColors: true, + }, + }) + } + + return &Handler{ + logrus: l, + } + +} + +func (h *Handler) Info(a ...interface{}) { + h.logrus.Info(a...) +} + +func (h *Handler) Infof(format string, a ...interface{}) { + h.logrus.Infof(format, a...) +} + +func (h *Handler) Warning(a ...interface{}) { + h.logrus.Warning(a...) +} + +func (h *Handler) Warningf(format string, a ...interface{}) { + h.logrus.Warningf(format, a...) +} + +func (h *Handler) Error(a ...interface{}) { + h.logrus.Error(a...) +} + +func (h *Handler) Errorf(format string, a ...interface{}) { + h.logrus.Errorf(format, a...) +} + +func (h *Handler) Debug(a ...interface{}) { + h.logrus.Debug(a...) +} + +func (h *Handler) Debugf(format string, a ...interface{}) { + h.logrus.Debugf(format, a...) +} diff --git a/src/utils/logger/hooks.go b/src/logger/hooks.go similarity index 66% rename from src/utils/logger/hooks.go rename to src/logger/hooks.go index 1355dcfb..e2bb39ce 100644 --- a/src/utils/logger/hooks.go +++ b/src/logger/hooks.go @@ -10,8 +10,9 @@ import ( ) type VarLogHook struct { - path string - levels []logrus.Level + path string + levels []logrus.Level + formatter logrus.Formatter lock sync.Mutex } @@ -23,7 +24,8 @@ func (hook *VarLogHook) Levels() []logrus.Level { func (hook *VarLogHook) Fire(entry *logrus.Entry) error { hook.lock.Lock() defer hook.lock.Unlock() - msg, err := (&logrus.TextFormatter{}).Format(entry) + + msg, err := hook.formatter.Format(entry) if err != nil { fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) return err @@ -47,7 +49,8 @@ func (hook *VarLogHook) Fire(entry *logrus.Entry) error { } type StdoutHook struct { - levels []logrus.Level + levels []logrus.Level + formatter logrus.Formatter } func (hook *StdoutHook) Levels() []logrus.Level { @@ -55,16 +58,20 @@ func (hook *StdoutHook) Levels() []logrus.Level { } func (hook *StdoutHook) Fire(entry *logrus.Entry) error { - msg, err := (&logrus.TextFormatter{}).Format(entry) - if err != nil { - fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) - return err + msg := []byte(entry.Message) + if hook.formatter != nil { + if formattedEntry, err := hook.formatter.Format(entry); err != nil { + fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) + } else { + msg = formattedEntry + } + } else { + msg = append(msg, '\n') } if entry.Level <= logrus.ErrorLevel { - io.WriteString(os.Stderr, string(msg)) + os.Stderr.Write(msg) } else { - io.WriteString(os.Stdout, string(msg)) - + os.Stdout.Write(msg) } return nil } diff --git a/src/utils/logger/interface.go b/src/logger/interface.go similarity index 100% rename from src/utils/logger/interface.go rename to src/logger/interface.go diff --git a/src/metaError/errors.go b/src/metaError/errors.go deleted file mode 100644 index cbd780fc..00000000 --- a/src/metaError/errors.go +++ /dev/null @@ -1,32 +0,0 @@ -package metaError - -import ( - "errors" - "fmt" - "os" - "strings" - - "github.com/ghodss/yaml" -) - -type apiError interface { - GetMeta() any - GetMessage() string -} - -// Print prints out meta in the os.Stderr -func Print(err error) { - var apiErr apiError - if !errors.As(err, &apiErr) { - fmt.Fprintln(os.Stderr, "error:", err) - return - } - fmt.Fprintln(os.Stderr, "error:", strings.ToLower(apiErr.GetMessage())) - if apiErr.GetMeta() != nil { - meta, err := yaml.Marshal(apiErr.GetMeta()) - if err != nil { - fmt.Fprintln(os.Stderr, "couldn't parse meta") - } - fmt.Fprintln(os.Stderr, string(meta)) - } -} diff --git a/src/nettools/pickIP.go b/src/nettools/pickIP.go deleted file mode 100644 index 53c071fb..00000000 --- a/src/nettools/pickIP.go +++ /dev/null @@ -1,19 +0,0 @@ -package nettools - -import ( - "net" - "time" -) - -func PickIP(port string, ips ...net.IP) net.IP { - timeout := time.Second * 5 - for _, ip := range ips { - conn, err := net.DialTimeout("tcp", net.JoinHostPort(ip.String(), port), timeout) - if err != nil { - continue - } - conn.Close() - return ip - } - return nil -} diff --git a/src/nettools/ping.go b/src/nettools/ping.go deleted file mode 100644 index 573897e3..00000000 --- a/src/nettools/ping.go +++ /dev/null @@ -1,73 +0,0 @@ -package nettools - -import ( - "context" - "fmt" - "os/exec" - "runtime" - "strings" -) - -func HasIPv6PingCommand() bool { - if hasPing6Command() { - return true - } - if _, err := exec.LookPath("ping"); err == nil { - return true - } - return runtime.GOOS == "windows" -} - -func hasPing6Command() bool { - _, err := exec.LookPath("ping6") - return err == nil -} - -func Ping(ctx context.Context, address string) error { - cmd := []string{"ping6", "-c", "1", address} - if !hasPing6Command() { - cmd = []string{"ping", "-6", "-c", "1", address} - } - if runtime.GOOS == "windows" { - cmd = []string{"ping", "/n", "1", address} - } - - if out, err := exec.CommandContext(ctx, cmd[0], cmd[1:]...).Output(); err != nil { - return pingError(err, cmd, out) - } - return nil -} - -type PingError struct { - err error - cmd []string - output string -} - -func (p PingError) Err() error { - return p.err -} - -func (p PingError) Output() string { - return p.output -} - -func (p PingError) Cmd() string { - return strings.Join(p.cmd, " ") -} - -func (p PingError) Error() string { - return fmt.Sprintf("ping => err: %s, exec: %s, output: %s", p.err, p.Cmd(), p.output) -} - -func pingError( - err error, - cmd []string, - output []byte, -) error { - return PingError{ - err: err, - cmd: cmd, - output: string(output), - } -} diff --git a/src/nettools/read.go b/src/nettools/read.go deleted file mode 100644 index 5fa22b5c..00000000 --- a/src/nettools/read.go +++ /dev/null @@ -1,24 +0,0 @@ -package nettools - -import "net" - -func GetInterfaceNameByIp(interfaceIp net.IP) (string, bool, error) { - interfaces, err := net.Interfaces() - if err != nil { - return "", false, err - } - for _, in := range interfaces { - addresses, err := in.Addrs() - if err != nil { - return "", false, err - } - for _, address := range addresses { - if ip, isIp := address.(*net.IPNet); isIp { - if ip.IP.Equal(interfaceIp) { - return in.Name, true, nil - } - } - } - } - return "", false, nil -} diff --git a/src/utils/params/handler.go b/src/params/handler.go similarity index 60% rename from src/utils/params/handler.go rename to src/params/handler.go index b5708df7..0171ab7c 100644 --- a/src/utils/params/handler.go +++ b/src/params/handler.go @@ -60,51 +60,23 @@ func (h *Handler) RegisterBool(cmd *cobra.Command, name string, defaultValue boo } } -func (h *Handler) RegisterPersistentString(cmd *cobra.Command, name, defaultValue, description string) { - var paramValue string +func (h *Handler) RegisterInt(cmd *cobra.Command, name string, defaultValue int, description string) { + var paramValue int - cmd.PersistentFlags().StringVar(¶mValue, name, defaultValue, description) - h.viper.BindPFlags(cmd.PersistentFlags()) + cmd.Flags().IntVar(¶mValue, name, defaultValue, description) - h.params[name] = func() *string { + h.params[h.getCmdId(cmd, name)] = func() *int { if cmd.Flags().Lookup(name).Changed { return ¶mValue } - if h.viper.GetString(name) != "" { - v := h.viper.GetString(name) + if h.viper.GetInt(name) != 0 { + v := h.viper.GetInt(name) return &v } return ¶mValue } } -func (h *Handler) RegisterUInt32(cmd *cobra.Command, name string, defaultValue uint32, description string) { - var paramValue uint32 - - cmd.Flags().Uint32Var(¶mValue, name, defaultValue, description) - - h.params[name] = func() *uint32 { - if cmd.Flags().Lookup(name).Changed { - return ¶mValue - } - if h.viper.GetUint32(name) != 0 { - v := h.viper.GetUint32(name) - return &v - } - return ¶mValue - } -} - -func (h *Handler) GetPersistentString(name string) string { - if param, exists := h.params[name]; exists { - if v, ok := param.(func() *string); ok { - return *v() - } - return "" - } - return "" -} - func (h *Handler) GetString(cmd *cobra.Command, name string) string { id := h.getCmdId(cmd, name) if param, exists := h.params[id]; exists { @@ -116,19 +88,10 @@ func (h *Handler) GetString(cmd *cobra.Command, name string) string { return "" } -func (h *Handler) GetStringP(cmd *cobra.Command, name string) *string { +func (h *Handler) GetInt(cmd *cobra.Command, name string) int { id := h.getCmdId(cmd, name) if param, exists := h.params[id]; exists { - if v, ok := param.(func() *string); ok { - return v() - } - } - return nil -} - -func (h *Handler) GetUint32(name string) uint32 { - if param, exists := h.params[name]; exists { - if v, ok := param.(func() *uint32); ok { + if v, ok := param.(func() *int); ok { return *v() } return 0 @@ -136,15 +99,6 @@ func (h *Handler) GetUint32(name string) uint32 { return 0 } -func (h *Handler) GetUint32P(name string) *uint32 { - if param, exists := h.params[name]; exists { - if v, ok := param.(func() *uint32); ok { - return v() - } - } - return nil -} - func (h *Handler) GetBool(cmd *cobra.Command, name string) bool { id := h.getCmdId(cmd, name) if param, exists := h.params[id]; exists { @@ -161,13 +115,14 @@ func (h *Handler) InitViper() error { if err != nil { return err } - cliStorage, err := constants.CliStorageFilepath() + cliDataPath, err := constants.CliDataFilePath() if err != nil { return err } h.viper.AddConfigPath(path) - h.viper.AddConfigPath(cliStorage) + h.viper.AddConfigPath(cliDataPath) h.viper.SetConfigName("zcli.config") + h.viper.SetEnvPrefix("ZEROPS") h.viper.AutomaticEnv() if err := h.viper.ReadInConfig(); err == nil { diff --git a/src/prolongVpn/prolong.go b/src/prolongVpn/prolong.go deleted file mode 100644 index fb28754b..00000000 --- a/src/prolongVpn/prolong.go +++ /dev/null @@ -1,110 +0,0 @@ -package prolongVpn - -import ( - "context" - "errors" - "os" - "time" - - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/vpnproxy" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/logger" - "golang.zx2c4.com/wireguard/wgctrl" -) - -const ( - cronInterval = time.Minute - thresholdInterval = 10 * time.Minute -) - -type Handler struct { - storage *daemonStorage.Handler - log *logger.Handler -} - -func New(storage *daemonStorage.Handler, log *logger.Handler) *Handler { - return &Handler{ - storage: storage, - log: log, - } -} - -func (h *Handler) Run(ctx context.Context) error { - t := time.NewTicker(cronInterval) - defer t.Stop() - - for { - select { - case <-ctx.Done(): - return nil - case <-t.C: - h.log.Debug("checking prolong") - err := h.prolong(ctx) - if err != nil { - h.log.Warning("prolong: ", err) - } - } - } -} - -func (h *Handler) prolong(ctx context.Context) error { - data := h.storage.Data() - if data.InterfaceName == "" { - return nil - } - if data.Expiry.Sub(time.Now()) > thresholdInterval { - return nil - } - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{CaCertificateUrl: data.CaCertificateUrl}) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient(ctx, data.GrpcApiAddress, data.Token) - if err != nil { - return err - } - defer closeFunc() - - wgClient, err := wgctrl.New() - if err != nil { - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wgClient.Close() - - device, err := wgClient.Device(data.InterfaceName) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return nil - } - return err - } - - businessResp, err := apiGrpcClient.PostVpnRequest(ctx, &zBusinessZeropsApiProtocol.PostVpnRequestRequest{ - Id: data.ProjectId, - ClientPublicKey: device.PublicKey.String(), - }) - if err := proto.BusinessError(businessResp, err); err != nil { - return err - } - expiry := businessResp.GetOutput().GetExpiry() - accessToken := businessResp.GetOutput().GetAccessToken() - - vpnClient, closeFn, err := vpnproxy.CreateClient(ctx, data.GrpcTargetVpnAddress) - if err != nil { - return err - } - vpnResp, err := vpnClient.ProlongVpn(ctx, &vpnproxy.ProlongVpnRequest{ - AccessToken: accessToken, - }) - closeFn() - if err := proto.VpnError(vpnResp, err); err != nil { - return err - } - - h.storage.Update(func(data daemonStorage.Data) daemonStorage.Data { - data.Expiry = zBusinessZeropsApiProtocol.FromProtoTimestamp(expiry) - return data - }) - - return nil -} diff --git a/src/proto/daemon/build-pb b/src/proto/daemon/build-pb deleted file mode 100755 index 5ce337f4..00000000 --- a/src/proto/daemon/build-pb +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -PTYPES=`go list -f '{{ .Dir }}' -m github.com/golang/protobuf` - -protoc \ - -I . \ - -I ${PTYPES}/ptypes \ - --go_out=paths=source_relative:. \ - --go-grpc_out=paths=source_relative:. *.proto - -if [ $? -ne 0 ]; then - echo FAIL - exit 1 -fi diff --git a/src/proto/daemon/build-pb-generate.go b/src/proto/daemon/build-pb-generate.go deleted file mode 100644 index ff561ad0..00000000 --- a/src/proto/daemon/build-pb-generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package daemon - -//go:generate gomodrun /bin/bash build-pb diff --git a/src/proto/daemon/client.go b/src/proto/daemon/client.go deleted file mode 100644 index d25f6a54..00000000 --- a/src/proto/daemon/client.go +++ /dev/null @@ -1,18 +0,0 @@ -package daemon - -import ( - "context" - - "google.golang.org/grpc" -) - -func CreateClient(ctx context.Context) (_ ZeropsDaemonProtocolClient, closeFunc func(), err error) { - connection, err := grpc.DialContext(ctx, daemonDialAddress(), grpc.WithInsecure()) - if err != nil { - return nil, nil, err - } - - closeFunc = func() { _ = connection.Close() } - - return NewZeropsDaemonProtocolClient(connection), closeFunc, nil -} diff --git a/src/proto/daemon/client_address_darwin.go b/src/proto/daemon/client_address_darwin.go deleted file mode 100644 index 05c1780e..00000000 --- a/src/proto/daemon/client_address_darwin.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build darwin -// +build darwin - -package daemon - -import ( - "github.com/zeropsio/zcli/src/constants" -) - -func daemonDialAddress() string { - return "unix:///" + constants.DaemonAddress -} diff --git a/src/proto/daemon/client_address_linux.go b/src/proto/daemon/client_address_linux.go deleted file mode 100644 index 2833687e..00000000 --- a/src/proto/daemon/client_address_linux.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build linux -// +build linux - -package daemon - -import ( - "github.com/zeropsio/zcli/src/constants" -) - -func daemonDialAddress() string { - return "unix:///" + constants.DaemonAddress -} diff --git a/src/proto/daemon/client_address_windows.go b/src/proto/daemon/client_address_windows.go deleted file mode 100644 index 3a46116e..00000000 --- a/src/proto/daemon/client_address_windows.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build windows -// +build windows - -package daemon - -import ( - "github.com/zeropsio/zcli/src/constants" -) - -func daemonDialAddress() string { - return "localhost" + constants.DaemonAddress -} diff --git a/src/proto/daemon/zeropsDaemonProtocol.pb.go b/src/proto/daemon/zeropsDaemonProtocol.pb.go deleted file mode 100644 index 81e81193..00000000 --- a/src/proto/daemon/zeropsDaemonProtocol.pb.go +++ /dev/null @@ -1,546 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.3 -// source: zeropsDaemonProtocol.proto - -package daemon - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type TunnelState int32 - -const ( - TunnelState_TUNNEL_SET_INACTIVE TunnelState = 0 - TunnelState_TUNNEL_ACTIVE TunnelState = 1 -) - -// Enum value maps for TunnelState. -var ( - TunnelState_name = map[int32]string{ - 0: "TUNNEL_SET_INACTIVE", - 1: "TUNNEL_ACTIVE", - } - TunnelState_value = map[string]int32{ - "TUNNEL_SET_INACTIVE": 0, - "TUNNEL_ACTIVE": 1, - } -) - -func (x TunnelState) Enum() *TunnelState { - p := new(TunnelState) - *p = x - return p -} - -func (x TunnelState) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TunnelState) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsDaemonProtocol_proto_enumTypes[0].Descriptor() -} - -func (TunnelState) Type() protoreflect.EnumType { - return &file_zeropsDaemonProtocol_proto_enumTypes[0] -} - -func (x TunnelState) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TunnelState.Descriptor instead. -func (TunnelState) EnumDescriptor() ([]byte, []int) { - return file_zeropsDaemonProtocol_proto_rawDescGZIP(), []int{0} -} - -type DnsState int32 - -const ( - DnsState_DNS_SET_INACTIVE DnsState = 0 - DnsState_DNS_ACTIVE DnsState = 1 -) - -// Enum value maps for DnsState. -var ( - DnsState_name = map[int32]string{ - 0: "DNS_SET_INACTIVE", - 1: "DNS_ACTIVE", - } - DnsState_value = map[string]int32{ - "DNS_SET_INACTIVE": 0, - "DNS_ACTIVE": 1, - } -) - -func (x DnsState) Enum() *DnsState { - p := new(DnsState) - *p = x - return p -} - -func (x DnsState) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DnsState) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsDaemonProtocol_proto_enumTypes[1].Descriptor() -} - -func (DnsState) Type() protoreflect.EnumType { - return &file_zeropsDaemonProtocol_proto_enumTypes[1] -} - -func (x DnsState) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DnsState.Descriptor instead. -func (DnsState) EnumDescriptor() ([]byte, []int) { - return file_zeropsDaemonProtocol_proto_rawDescGZIP(), []int{1} -} - -type VpnStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TunnelState TunnelState `protobuf:"varint,1,opt,name=tunnelState,proto3,enum=zeropsDaemonProtocol.TunnelState" json:"tunnelState,omitempty"` - DnsState DnsState `protobuf:"varint,2,opt,name=dnsState,proto3,enum=zeropsDaemonProtocol.DnsState" json:"dnsState,omitempty"` - AdditionalInfo string `protobuf:"bytes,3,opt,name=additionalInfo,proto3" json:"additionalInfo,omitempty"` -} - -func (x *VpnStatus) Reset() { - *x = VpnStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VpnStatus) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VpnStatus) ProtoMessage() {} - -func (x *VpnStatus) ProtoReflect() protoreflect.Message { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VpnStatus.ProtoReflect.Descriptor instead. -func (*VpnStatus) Descriptor() ([]byte, []int) { - return file_zeropsDaemonProtocol_proto_rawDescGZIP(), []int{0} -} - -func (x *VpnStatus) GetTunnelState() TunnelState { - if x != nil { - return x.TunnelState - } - return TunnelState_TUNNEL_SET_INACTIVE -} - -func (x *VpnStatus) GetDnsState() DnsState { - if x != nil { - return x.DnsState - } - return DnsState_DNS_SET_INACTIVE -} - -func (x *VpnStatus) GetAdditionalInfo() string { - if x != nil { - return x.AdditionalInfo - } - return "" -} - -type StartVpnRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ApiAddress string `protobuf:"bytes,1,opt,name=apiAddress,proto3" json:"apiAddress,omitempty"` - VpnAddress string `protobuf:"bytes,2,opt,name=vpnAddress,proto3" json:"vpnAddress,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` - Mtu uint32 `protobuf:"varint,5,opt,name=mtu,proto3" json:"mtu,omitempty"` - UserId string `protobuf:"bytes,6,opt,name=userId,proto3" json:"userId,omitempty"` - CaCertificateUrl string `protobuf:"bytes,7,opt,name=caCertificateUrl,proto3" json:"caCertificateUrl,omitempty"` - PreferredPortMin uint32 `protobuf:"varint,8,opt,name=preferredPortMin,proto3" json:"preferredPortMin,omitempty"` - PreferredPortMax uint32 `protobuf:"varint,9,opt,name=preferredPortMax,proto3" json:"preferredPortMax,omitempty"` -} - -func (x *StartVpnRequest) Reset() { - *x = StartVpnRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StartVpnRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StartVpnRequest) ProtoMessage() {} - -func (x *StartVpnRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StartVpnRequest.ProtoReflect.Descriptor instead. -func (*StartVpnRequest) Descriptor() ([]byte, []int) { - return file_zeropsDaemonProtocol_proto_rawDescGZIP(), []int{1} -} - -func (x *StartVpnRequest) GetApiAddress() string { - if x != nil { - return x.ApiAddress - } - return "" -} - -func (x *StartVpnRequest) GetVpnAddress() string { - if x != nil { - return x.VpnAddress - } - return "" -} - -func (x *StartVpnRequest) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *StartVpnRequest) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *StartVpnRequest) GetMtu() uint32 { - if x != nil { - return x.Mtu - } - return 0 -} - -func (x *StartVpnRequest) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *StartVpnRequest) GetCaCertificateUrl() string { - if x != nil { - return x.CaCertificateUrl - } - return "" -} - -func (x *StartVpnRequest) GetPreferredPortMin() uint32 { - if x != nil { - return x.PreferredPortMin - } - return 0 -} - -func (x *StartVpnRequest) GetPreferredPortMax() uint32 { - if x != nil { - return x.PreferredPortMax - } - return 0 -} - -type StopVpnRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *StopVpnRequest) Reset() { - *x = StopVpnRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StopVpnRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StopVpnRequest) ProtoMessage() {} - -func (x *StopVpnRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StopVpnRequest.ProtoReflect.Descriptor instead. -func (*StopVpnRequest) Descriptor() ([]byte, []int) { - return file_zeropsDaemonProtocol_proto_rawDescGZIP(), []int{2} -} - -type StatusVpnRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *StatusVpnRequest) Reset() { - *x = StatusVpnRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatusVpnRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusVpnRequest) ProtoMessage() {} - -func (x *StatusVpnRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsDaemonProtocol_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusVpnRequest.ProtoReflect.Descriptor instead. -func (*StatusVpnRequest) Descriptor() ([]byte, []int) { - return file_zeropsDaemonProtocol_proto_rawDescGZIP(), []int{3} -} - -var File_zeropsDaemonProtocol_proto protoreflect.FileDescriptor - -var file_zeropsDaemonProtocol_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x7a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x22, 0xb4, 0x01, 0x0a, 0x09, 0x76, 0x70, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x43, 0x0a, 0x0b, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, - 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x74, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x64, - 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x64, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xb3, 0x02, 0x0a, 0x0f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x70, 0x69, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x76, 0x70, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x76, 0x70, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, - 0x6d, 0x74, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x61, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, - 0x4d, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x70, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x78, 0x22, - 0x10, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x70, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x12, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x70, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x39, 0x0a, 0x0b, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x55, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x53, - 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a, - 0x0d, 0x54, 0x55, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, - 0x2a, 0x30, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x10, - 0x44, 0x4e, 0x53, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, - 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4e, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, - 0x10, 0x01, 0x32, 0x92, 0x02, 0x0a, 0x14, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x52, 0x0a, 0x08, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x12, 0x25, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x76, 0x70, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x50, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x56, 0x70, 0x6e, 0x12, 0x24, 0x2e, 0x7a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x73, 0x74, 0x6f, 0x70, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x76, 0x70, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x54, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x70, 0x6e, 0x12, 0x26, - 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x70, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x44, - 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x76, 0x70, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x69, 0x6f, 0x2f, 0x7a, - 0x63, 0x6c, 0x69, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2f, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_zeropsDaemonProtocol_proto_rawDescOnce sync.Once - file_zeropsDaemonProtocol_proto_rawDescData = file_zeropsDaemonProtocol_proto_rawDesc -) - -func file_zeropsDaemonProtocol_proto_rawDescGZIP() []byte { - file_zeropsDaemonProtocol_proto_rawDescOnce.Do(func() { - file_zeropsDaemonProtocol_proto_rawDescData = protoimpl.X.CompressGZIP(file_zeropsDaemonProtocol_proto_rawDescData) - }) - return file_zeropsDaemonProtocol_proto_rawDescData -} - -var file_zeropsDaemonProtocol_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_zeropsDaemonProtocol_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_zeropsDaemonProtocol_proto_goTypes = []interface{}{ - (TunnelState)(0), // 0: zeropsDaemonProtocol.tunnelState - (DnsState)(0), // 1: zeropsDaemonProtocol.dnsState - (*VpnStatus)(nil), // 2: zeropsDaemonProtocol.vpnStatus - (*StartVpnRequest)(nil), // 3: zeropsDaemonProtocol.startVpnRequest - (*StopVpnRequest)(nil), // 4: zeropsDaemonProtocol.stopVpnRequest - (*StatusVpnRequest)(nil), // 5: zeropsDaemonProtocol.statusVpnRequest -} -var file_zeropsDaemonProtocol_proto_depIdxs = []int32{ - 0, // 0: zeropsDaemonProtocol.vpnStatus.tunnelState:type_name -> zeropsDaemonProtocol.tunnelState - 1, // 1: zeropsDaemonProtocol.vpnStatus.dnsState:type_name -> zeropsDaemonProtocol.dnsState - 3, // 2: zeropsDaemonProtocol.ZeropsDaemonProtocol.startVpn:input_type -> zeropsDaemonProtocol.startVpnRequest - 4, // 3: zeropsDaemonProtocol.ZeropsDaemonProtocol.stopVpn:input_type -> zeropsDaemonProtocol.stopVpnRequest - 5, // 4: zeropsDaemonProtocol.ZeropsDaemonProtocol.statusVpn:input_type -> zeropsDaemonProtocol.statusVpnRequest - 2, // 5: zeropsDaemonProtocol.ZeropsDaemonProtocol.startVpn:output_type -> zeropsDaemonProtocol.vpnStatus - 2, // 6: zeropsDaemonProtocol.ZeropsDaemonProtocol.stopVpn:output_type -> zeropsDaemonProtocol.vpnStatus - 2, // 7: zeropsDaemonProtocol.ZeropsDaemonProtocol.statusVpn:output_type -> zeropsDaemonProtocol.vpnStatus - 5, // [5:8] is the sub-list for method output_type - 2, // [2:5] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_zeropsDaemonProtocol_proto_init() } -func file_zeropsDaemonProtocol_proto_init() { - if File_zeropsDaemonProtocol_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_zeropsDaemonProtocol_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VpnStatus); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsDaemonProtocol_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartVpnRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsDaemonProtocol_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopVpnRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsDaemonProtocol_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusVpnRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_zeropsDaemonProtocol_proto_rawDesc, - NumEnums: 2, - NumMessages: 4, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_zeropsDaemonProtocol_proto_goTypes, - DependencyIndexes: file_zeropsDaemonProtocol_proto_depIdxs, - EnumInfos: file_zeropsDaemonProtocol_proto_enumTypes, - MessageInfos: file_zeropsDaemonProtocol_proto_msgTypes, - }.Build() - File_zeropsDaemonProtocol_proto = out.File - file_zeropsDaemonProtocol_proto_rawDesc = nil - file_zeropsDaemonProtocol_proto_goTypes = nil - file_zeropsDaemonProtocol_proto_depIdxs = nil -} diff --git a/src/proto/daemon/zeropsDaemonProtocol.proto b/src/proto/daemon/zeropsDaemonProtocol.proto deleted file mode 100644 index c3be19d8..00000000 --- a/src/proto/daemon/zeropsDaemonProtocol.proto +++ /dev/null @@ -1,45 +0,0 @@ -syntax = "proto3"; - -option go_package = "github.com/zeropsio/zcli/src/protocol/daemon"; - -package zeropsDaemonProtocol; - -service ZeropsDaemonProtocol { - rpc startVpn (startVpnRequest) returns (vpnStatus); - rpc stopVpn (stopVpnRequest) returns (vpnStatus); - rpc statusVpn (statusVpnRequest) returns (vpnStatus); -} - -enum tunnelState { - TUNNEL_SET_INACTIVE = 0; - TUNNEL_ACTIVE = 1; -} - -enum dnsState { - DNS_SET_INACTIVE = 0; - DNS_ACTIVE = 1; -} - -message vpnStatus { - tunnelState tunnelState = 1; - dnsState dnsState = 2; - string additionalInfo = 3; -} - -message startVpnRequest { - string apiAddress = 1; - string vpnAddress = 2; - string projectId = 3; - string token = 4; - uint32 mtu = 5; - string userId = 6; - string caCertificateUrl = 7; - uint32 preferredPortMin = 8; - uint32 preferredPortMax = 9; -} - -message stopVpnRequest { -} - -message statusVpnRequest { -} diff --git a/src/proto/daemon/zeropsDaemonProtocol_grpc.pb.go b/src/proto/daemon/zeropsDaemonProtocol_grpc.pb.go deleted file mode 100644 index 0bcb4e82..00000000 --- a/src/proto/daemon/zeropsDaemonProtocol_grpc.pb.go +++ /dev/null @@ -1,177 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.3 -// source: zeropsDaemonProtocol.proto - -package daemon - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ZeropsDaemonProtocolClient is the client API for ZeropsDaemonProtocol service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ZeropsDaemonProtocolClient interface { - StartVpn(ctx context.Context, in *StartVpnRequest, opts ...grpc.CallOption) (*VpnStatus, error) - StopVpn(ctx context.Context, in *StopVpnRequest, opts ...grpc.CallOption) (*VpnStatus, error) - StatusVpn(ctx context.Context, in *StatusVpnRequest, opts ...grpc.CallOption) (*VpnStatus, error) -} - -type zeropsDaemonProtocolClient struct { - cc grpc.ClientConnInterface -} - -func NewZeropsDaemonProtocolClient(cc grpc.ClientConnInterface) ZeropsDaemonProtocolClient { - return &zeropsDaemonProtocolClient{cc} -} - -func (c *zeropsDaemonProtocolClient) StartVpn(ctx context.Context, in *StartVpnRequest, opts ...grpc.CallOption) (*VpnStatus, error) { - out := new(VpnStatus) - err := c.cc.Invoke(ctx, "/zeropsDaemonProtocol.ZeropsDaemonProtocol/startVpn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zeropsDaemonProtocolClient) StopVpn(ctx context.Context, in *StopVpnRequest, opts ...grpc.CallOption) (*VpnStatus, error) { - out := new(VpnStatus) - err := c.cc.Invoke(ctx, "/zeropsDaemonProtocol.ZeropsDaemonProtocol/stopVpn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zeropsDaemonProtocolClient) StatusVpn(ctx context.Context, in *StatusVpnRequest, opts ...grpc.CallOption) (*VpnStatus, error) { - out := new(VpnStatus) - err := c.cc.Invoke(ctx, "/zeropsDaemonProtocol.ZeropsDaemonProtocol/statusVpn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ZeropsDaemonProtocolServer is the server API for ZeropsDaemonProtocol service. -// All implementations must embed UnimplementedZeropsDaemonProtocolServer -// for forward compatibility -type ZeropsDaemonProtocolServer interface { - StartVpn(context.Context, *StartVpnRequest) (*VpnStatus, error) - StopVpn(context.Context, *StopVpnRequest) (*VpnStatus, error) - StatusVpn(context.Context, *StatusVpnRequest) (*VpnStatus, error) - mustEmbedUnimplementedZeropsDaemonProtocolServer() -} - -// UnimplementedZeropsDaemonProtocolServer must be embedded to have forward compatible implementations. -type UnimplementedZeropsDaemonProtocolServer struct { -} - -func (UnimplementedZeropsDaemonProtocolServer) StartVpn(context.Context, *StartVpnRequest) (*VpnStatus, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartVpn not implemented") -} -func (UnimplementedZeropsDaemonProtocolServer) StopVpn(context.Context, *StopVpnRequest) (*VpnStatus, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopVpn not implemented") -} -func (UnimplementedZeropsDaemonProtocolServer) StatusVpn(context.Context, *StatusVpnRequest) (*VpnStatus, error) { - return nil, status.Errorf(codes.Unimplemented, "method StatusVpn not implemented") -} -func (UnimplementedZeropsDaemonProtocolServer) mustEmbedUnimplementedZeropsDaemonProtocolServer() {} - -// UnsafeZeropsDaemonProtocolServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ZeropsDaemonProtocolServer will -// result in compilation errors. -type UnsafeZeropsDaemonProtocolServer interface { - mustEmbedUnimplementedZeropsDaemonProtocolServer() -} - -func RegisterZeropsDaemonProtocolServer(s grpc.ServiceRegistrar, srv ZeropsDaemonProtocolServer) { - s.RegisterService(&ZeropsDaemonProtocol_ServiceDesc, srv) -} - -func _ZeropsDaemonProtocol_StartVpn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartVpnRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZeropsDaemonProtocolServer).StartVpn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zeropsDaemonProtocol.ZeropsDaemonProtocol/startVpn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZeropsDaemonProtocolServer).StartVpn(ctx, req.(*StartVpnRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZeropsDaemonProtocol_StopVpn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StopVpnRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZeropsDaemonProtocolServer).StopVpn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zeropsDaemonProtocol.ZeropsDaemonProtocol/stopVpn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZeropsDaemonProtocolServer).StopVpn(ctx, req.(*StopVpnRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZeropsDaemonProtocol_StatusVpn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StatusVpnRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZeropsDaemonProtocolServer).StatusVpn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zeropsDaemonProtocol.ZeropsDaemonProtocol/statusVpn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZeropsDaemonProtocolServer).StatusVpn(ctx, req.(*StatusVpnRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// ZeropsDaemonProtocol_ServiceDesc is the grpc.ServiceDesc for ZeropsDaemonProtocol service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ZeropsDaemonProtocol_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "zeropsDaemonProtocol.ZeropsDaemonProtocol", - HandlerType: (*ZeropsDaemonProtocolServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "startVpn", - Handler: _ZeropsDaemonProtocol_StartVpn_Handler, - }, - { - MethodName: "stopVpn", - Handler: _ZeropsDaemonProtocol_StopVpn_Handler, - }, - { - MethodName: "statusVpn", - Handler: _ZeropsDaemonProtocol_StatusVpn_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "zeropsDaemonProtocol.proto", -} diff --git a/src/proto/errors.go b/src/proto/errors.go deleted file mode 100644 index f480c805..00000000 --- a/src/proto/errors.go +++ /dev/null @@ -1,140 +0,0 @@ -package proto - -import ( - "encoding/json" - "errors" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/vpnproxy" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -type HandleGrpcErrorOption func(*handleGrpcErrorConfig) - -type handleGrpcErrorConfig struct { - customTimeoutMessage string -} - -type Error struct { - Message string - Meta any -} - -func (e Error) Error() string { - return e.Message -} - -func (e Error) GetMessage() string { - return e.Message -} - -func (e Error) GetMeta() any { - return e.Meta -} - -type errorCode interface { - GetCodeInt() int - GetMeta() []byte - GetMessage() string -} - -type response[E errorCode] interface { - GetError() E -} - -func BusinessError[R response[*zBusinessZeropsApiProtocol.Error]]( - resp R, - err error, - options ...HandleGrpcErrorOption, -) error { - return GrpcError[*zBusinessZeropsApiProtocol.Error](resp, err, options...) -} - -func VpnError[R response[*vpnproxy.Error]]( - resp R, - err error, - options ...HandleGrpcErrorOption, -) error { - return GrpcError[*vpnproxy.Error](resp, err, options...) -} - -func GrpcError[T errorCode, R response[T]]( - resp R, - err error, - options ...HandleGrpcErrorOption, -) error { - config := handleGrpcErrorConfig{ - customTimeoutMessage: i18n.GrpcApiTimeout, - } - for _, o := range options { - o(&config) - } - - if err := handleGrpcError(err, config); err != nil { - return err - } - - noErrorCode := 0 - if resp.GetError().GetCodeInt() != noErrorCode { - zcliErr := Error{ - Message: resp.GetError().GetMessage(), - } - if meta := resp.GetError().GetMeta(); meta != nil { - zcliErr.Meta = json.RawMessage(meta) - } - return zcliErr - } - - return nil -} - -type Err struct { - Msg string - *status.Status -} - -func (e Err) Error() string { - if e.Msg != "" { - return e.Msg - } - return e.Status.Message() -} - -func IsUnauthenticated(err error) bool { - var e Err - if errors.As(err, &e) { - return e.Status.Code() == codes.Unauthenticated - } - return false -} - -func handleGrpcError(err error, config handleGrpcErrorConfig) error { - if err != nil { - if s, ok := status.FromError(err); ok { - err := Err{Status: s} - if s.Code() == codes.DeadlineExceeded { - err.Msg = config.customTimeoutMessage - } - return err - } - } - return nil -} - -func DaemonError( - err error, -) (daemonInstalled bool, _ error) { - if err != nil { - if s, ok := status.FromError(err); ok { - if s.Code() == codes.Unavailable { - return false, nil - } - return true, errors.New(s.Message()) - } - return true, err - } - return true, nil -} diff --git a/src/proto/unary/interceptor.go b/src/proto/unary/interceptor.go deleted file mode 100644 index b1d83f85..00000000 --- a/src/proto/unary/interceptor.go +++ /dev/null @@ -1,40 +0,0 @@ -package unary - -import ( - "context" - "fmt" - "time" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/zeropsio/zcli/src/utils/uuid" - "google.golang.org/grpc/metadata" - - "github.com/zeropsio/zcli/src/support" - - "google.golang.org/grpc" -) - -func TimeoutInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*60) - defer cancel() - return invoker(timeoutCtx, method, req, reply, cc, opts...) -} - -func SupportInterceptor(isInternal func(any) bool) grpc.UnaryClientInterceptor { - return func(ctx context.Context, method string, req, res interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - supportID, ok := support.GetID(ctx) - if !ok { - supportID = uuid.GetShort() - } - ctx = metadata.AppendToOutgoingContext(ctx, support.Key, supportID) - err := invoker(ctx, method, req, res, cc, opts...) - code := status.Code(err) - if code == codes.Unknown || code == codes.Unavailable || isInternal(res) { - fmt.Println("support id: ", supportID) - return err - } - return err - } -} diff --git a/src/proto/vpnproxy/build-pb b/src/proto/vpnproxy/build-pb deleted file mode 100755 index c6fe0d17..00000000 --- a/src/proto/vpnproxy/build-pb +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -PTYPES=`go list -f '{{ .Dir }}' -m github.com/golang/protobuf` - -protoc \ - -I . \ - -I ${PTYPES}/ptypes \ - --go_out=plugins=grpc,paths=source_relative:. *.proto - -if [ $? -ne 0 ]; then - echo FAIL - exit 1 -fi diff --git a/src/proto/vpnproxy/build-pb-generate.go b/src/proto/vpnproxy/build-pb-generate.go deleted file mode 100644 index e7310a7b..00000000 --- a/src/proto/vpnproxy/build-pb-generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package vpnproxy - -//go:generate gomodrun /bin/bash build-pb diff --git a/src/proto/vpnproxy/client.go b/src/proto/vpnproxy/client.go deleted file mode 100644 index 9d4b9e3a..00000000 --- a/src/proto/vpnproxy/client.go +++ /dev/null @@ -1,25 +0,0 @@ -package vpnproxy - -import ( - "context" - - "github.com/zeropsio/zcli/src/proto/unary" - - "google.golang.org/grpc" -) - -func CreateClient(ctx context.Context, targetAddress string) (_ ZeropsVpnProtocolClient, closeFunc func(), _ error) { - conn, err := grpc.DialContext( - ctx, - targetAddress, - grpc.WithInsecure(), - grpc.WithChainUnaryInterceptor(unary.TimeoutInterceptor, unary.SupportInterceptor(IsInternal)), - ) - if err != nil { - return nil, nil, err - } - - return NewZeropsVpnProtocolClient(conn), func() { - _ = conn.Close() - }, nil -} diff --git a/src/proto/vpnproxy/protocol_extra.go b/src/proto/vpnproxy/protocol_extra.go deleted file mode 100644 index 78a69ed6..00000000 --- a/src/proto/vpnproxy/protocol_extra.go +++ /dev/null @@ -1,60 +0,0 @@ -package vpnproxy - -import ( - "net" - "time" -) - -func FromProtoIP(m *IP) net.IP { - return m.GetAddress() -} - -func ToProtoIP(ip net.IP) *IP { - return &IP{ - Address: ip, - } -} - -func ToProtoIpNet(ipNet *net.IPNet) *IPRange { - return &IPRange{ - Ip: ipNet.IP, - Mask: ipNet.Mask, - } -} - -func ToProtoTimestamp(t time.Time) *Timestamp { - if t.IsZero() { - return &Timestamp{} - } - return &Timestamp{IsSet: true, Seconds: t.Unix(), Nanos: int32(t.Nanosecond())} -} - -func FromProtoTimestamp(t *Timestamp) time.Time { - if !t.GetIsSet() { - return time.Time{} - } - return time.Unix(t.GetSeconds(), int64(t.GetNanos())) -} - -func FromProtoIPRange(m *IPRange) net.IPNet { - return net.IPNet{ - IP: m.GetIp(), - Mask: m.GetMask(), - } -} - -func IsInternal(resp interface{}) bool { - errorGetter, ok := resp.(interface{ GetError() *Error }) - if !ok { - return true - } - return errorGetter.GetError().GetCode() == ErrorCode_INTERNAL_SERVER_ERROR -} - -func (x *Error) GetCodeInt() int { - return int(x.GetCode()) -} - -func (x *Error) GetMeta() []byte { - return nil -} diff --git a/src/proto/vpnproxy/zeropsVpnProtocol.pb.go b/src/proto/vpnproxy/zeropsVpnProtocol.pb.go deleted file mode 100644 index 83e12b29..00000000 --- a/src/proto/vpnproxy/zeropsVpnProtocol.pb.go +++ /dev/null @@ -1,1012 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.23.0 -// protoc v3.7.1 -// source: zeropsVpnProtocol.proto - -package vpnproxy - -import ( - context "context" - proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -type ErrorCode int32 - -const ( - ErrorCode_NO_ERROR ErrorCode = 0 - ErrorCode_INTERNAL_SERVER_ERROR ErrorCode = 1 - ErrorCode_INSTANCE_NOT_FOUND ErrorCode = 2 - ErrorCode_PROXY_IS_FULL ErrorCode = 3 - ErrorCode_INVALID_ACCESS_TOKEN ErrorCode = 4 - ErrorCode_VPN_SESSION_EXPIRED ErrorCode = 5 - ErrorCode_MAX_PARALLEL_VPN_LIMIT ErrorCode = 6 - ErrorCode_INVALID_PREFERRED_PORT ErrorCode = 7 - ErrorCode_PREFERRED_PORT_UNAVAILABLE ErrorCode = 8 -) - -// Enum value maps for ErrorCode. -var ( - ErrorCode_name = map[int32]string{ - 0: "NO_ERROR", - 1: "INTERNAL_SERVER_ERROR", - 2: "INSTANCE_NOT_FOUND", - 3: "PROXY_IS_FULL", - 4: "INVALID_ACCESS_TOKEN", - 5: "VPN_SESSION_EXPIRED", - 6: "MAX_PARALLEL_VPN_LIMIT", - 7: "INVALID_PREFERRED_PORT", - 8: "PREFERRED_PORT_UNAVAILABLE", - } - ErrorCode_value = map[string]int32{ - "NO_ERROR": 0, - "INTERNAL_SERVER_ERROR": 1, - "INSTANCE_NOT_FOUND": 2, - "PROXY_IS_FULL": 3, - "INVALID_ACCESS_TOKEN": 4, - "VPN_SESSION_EXPIRED": 5, - "MAX_PARALLEL_VPN_LIMIT": 6, - "INVALID_PREFERRED_PORT": 7, - "PREFERRED_PORT_UNAVAILABLE": 8, - } -) - -func (x ErrorCode) Enum() *ErrorCode { - p := new(ErrorCode) - *p = x - return p -} - -func (x ErrorCode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ErrorCode) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsVpnProtocol_proto_enumTypes[0].Descriptor() -} - -func (ErrorCode) Type() protoreflect.EnumType { - return &file_zeropsVpnProtocol_proto_enumTypes[0] -} - -func (x ErrorCode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ErrorCode.Descriptor instead. -func (ErrorCode) EnumDescriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{0} -} - -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=zeropsVpnProtocol.ErrorCode" json:"code,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *Error) Reset() { - *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{0} -} - -func (x *Error) GetCode() ErrorCode { - if x != nil { - return x.Code - } - return ErrorCode_NO_ERROR -} - -func (x *Error) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type IP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` -} - -func (x *IP) Reset() { - *x = IP{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IP) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IP) ProtoMessage() {} - -func (x *IP) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IP.ProtoReflect.Descriptor instead. -func (*IP) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{1} -} - -func (x *IP) GetAddress() []byte { - if x != nil { - return x.Address - } - return nil -} - -type IPRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` - Mask []byte `protobuf:"bytes,2,opt,name=mask,proto3" json:"mask,omitempty"` -} - -func (x *IPRange) Reset() { - *x = IPRange{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IPRange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IPRange) ProtoMessage() {} - -func (x *IPRange) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IPRange.ProtoReflect.Descriptor instead. -func (*IPRange) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{2} -} - -func (x *IPRange) GetIp() []byte { - if x != nil { - return x.Ip - } - return nil -} - -func (x *IPRange) GetMask() []byte { - if x != nil { - return x.Mask - } - return nil -} - -type Timestamp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IsSet bool `protobuf:"varint,1,opt,name=isSet,proto3" json:"isSet,omitempty"` - Seconds int64 `protobuf:"varint,2,opt,name=seconds,proto3" json:"seconds,omitempty"` - Nanos int32 `protobuf:"varint,3,opt,name=nanos,proto3" json:"nanos,omitempty"` -} - -func (x *Timestamp) Reset() { - *x = Timestamp{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Timestamp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Timestamp) ProtoMessage() {} - -func (x *Timestamp) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Timestamp.ProtoReflect.Descriptor instead. -func (*Timestamp) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{3} -} - -func (x *Timestamp) GetIsSet() bool { - if x != nil { - return x.IsSet - } - return false -} - -func (x *Timestamp) GetSeconds() int64 { - if x != nil { - return x.Seconds - } - return 0 -} - -func (x *Timestamp) GetNanos() int32 { - if x != nil { - return x.Nanos - } - return 0 -} - -type StartVpnRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AccessToken string `protobuf:"bytes,1,opt,name=accessToken,proto3" json:"accessToken,omitempty"` - PreferredPortMin uint32 `protobuf:"varint,2,opt,name=preferredPortMin,proto3" json:"preferredPortMin,omitempty"` - PreferredPortMax uint32 `protobuf:"varint,3,opt,name=preferredPortMax,proto3" json:"preferredPortMax,omitempty"` -} - -func (x *StartVpnRequest) Reset() { - *x = StartVpnRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StartVpnRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StartVpnRequest) ProtoMessage() {} - -func (x *StartVpnRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StartVpnRequest.ProtoReflect.Descriptor instead. -func (*StartVpnRequest) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{4} -} - -func (x *StartVpnRequest) GetAccessToken() string { - if x != nil { - return x.AccessToken - } - return "" -} - -func (x *StartVpnRequest) GetPreferredPortMin() uint32 { - if x != nil { - return x.PreferredPortMin - } - return 0 -} - -func (x *StartVpnRequest) GetPreferredPortMax() uint32 { - if x != nil { - return x.PreferredPortMax - } - return 0 -} - -type StartVpnResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Vpn *StartVpnOutDto `protobuf:"bytes,2,opt,name=vpn,proto3" json:"vpn,omitempty"` -} - -func (x *StartVpnResponse) Reset() { - *x = StartVpnResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StartVpnResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StartVpnResponse) ProtoMessage() {} - -func (x *StartVpnResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StartVpnResponse.ProtoReflect.Descriptor instead. -func (*StartVpnResponse) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{5} -} - -func (x *StartVpnResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *StartVpnResponse) GetVpn() *StartVpnOutDto { - if x != nil { - return x.Vpn - } - return nil -} - -type StartVpnOutDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Port int64 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"` - ServerPublicKey string `protobuf:"bytes,2,opt,name=serverPublicKey,proto3" json:"serverPublicKey,omitempty"` - AssignedClientIp *IP `protobuf:"bytes,3,opt,name=assignedClientIp,proto3" json:"assignedClientIp,omitempty"` - ServerIp *IP `protobuf:"bytes,4,opt,name=serverIp,proto3" json:"serverIp,omitempty"` - VpnIpRange *IPRange `protobuf:"bytes,5,opt,name=vpnIpRange,proto3" json:"vpnIpRange,omitempty"` - DnsIp *IP `protobuf:"bytes,6,opt,name=dnsIp,proto3" json:"dnsIp,omitempty"` -} - -func (x *StartVpnOutDto) Reset() { - *x = StartVpnOutDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StartVpnOutDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StartVpnOutDto) ProtoMessage() {} - -func (x *StartVpnOutDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StartVpnOutDto.ProtoReflect.Descriptor instead. -func (*StartVpnOutDto) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{6} -} - -func (x *StartVpnOutDto) GetPort() int64 { - if x != nil { - return x.Port - } - return 0 -} - -func (x *StartVpnOutDto) GetServerPublicKey() string { - if x != nil { - return x.ServerPublicKey - } - return "" -} - -func (x *StartVpnOutDto) GetAssignedClientIp() *IP { - if x != nil { - return x.AssignedClientIp - } - return nil -} - -func (x *StartVpnOutDto) GetServerIp() *IP { - if x != nil { - return x.ServerIp - } - return nil -} - -func (x *StartVpnOutDto) GetVpnIpRange() *IPRange { - if x != nil { - return x.VpnIpRange - } - return nil -} - -func (x *StartVpnOutDto) GetDnsIp() *IP { - if x != nil { - return x.DnsIp - } - return nil -} - -type ProlongVpnRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AccessToken string `protobuf:"bytes,1,opt,name=accessToken,proto3" json:"accessToken,omitempty"` -} - -func (x *ProlongVpnRequest) Reset() { - *x = ProlongVpnRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProlongVpnRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProlongVpnRequest) ProtoMessage() {} - -func (x *ProlongVpnRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProlongVpnRequest.ProtoReflect.Descriptor instead. -func (*ProlongVpnRequest) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{7} -} - -func (x *ProlongVpnRequest) GetAccessToken() string { - if x != nil { - return x.AccessToken - } - return "" -} - -type ProlongVpnResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *ProlongVpnResponse) Reset() { - *x = ProlongVpnResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsVpnProtocol_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProlongVpnResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProlongVpnResponse) ProtoMessage() {} - -func (x *ProlongVpnResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsVpnProtocol_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProlongVpnResponse.ProtoReflect.Descriptor instead. -func (*ProlongVpnResponse) Descriptor() ([]byte, []int) { - return file_zeropsVpnProtocol_proto_rawDescGZIP(), []int{8} -} - -func (x *ProlongVpnResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -var File_zeropsVpnProtocol_proto protoreflect.FileDescriptor - -var file_zeropsVpnProtocol_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x7a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x53, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x30, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, - 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x1e, 0x0a, 0x02, 0x49, 0x50, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x2d, 0x0a, 0x07, 0x49, 0x50, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, - 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, - 0x22, 0x51, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x73, 0x53, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, - 0x53, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x6e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x61, - 0x6e, 0x6f, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6f, - 0x72, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x61, - 0x78, 0x22, 0x77, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x03, 0x76, 0x70, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x4f, - 0x75, 0x74, 0x44, 0x74, 0x6f, 0x52, 0x03, 0x76, 0x70, 0x6e, 0x22, 0xad, 0x02, 0x0a, 0x0e, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x4f, 0x75, 0x74, 0x44, 0x74, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x10, 0x61, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, - 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x50, 0x52, 0x10, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x31, - 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x50, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, - 0x70, 0x12, 0x3a, 0x0a, 0x0a, 0x76, 0x70, 0x6e, 0x49, 0x70, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, - 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x50, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x0a, 0x76, 0x70, 0x6e, 0x49, 0x70, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2b, 0x0a, - 0x05, 0x64, 0x6e, 0x73, 0x49, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x7a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x49, 0x50, 0x52, 0x05, 0x64, 0x6e, 0x73, 0x49, 0x70, 0x22, 0x35, 0x0a, 0x11, 0x70, 0x72, - 0x6f, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x44, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x70, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, - 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, 0xea, 0x01, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x16, - 0x0a, 0x12, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x5f, - 0x49, 0x53, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, - 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x50, 0x4e, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, - 0x4d, 0x41, 0x58, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4c, 0x4c, 0x45, 0x4c, 0x5f, 0x56, 0x50, 0x4e, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x4f, - 0x52, 0x54, 0x10, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, - 0x44, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, - 0x4c, 0x45, 0x10, 0x08, 0x32, 0xc3, 0x01, 0x0a, 0x11, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, - 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x53, 0x0a, 0x08, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x12, 0x22, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, - 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x7a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x59, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x70, 0x6e, 0x12, 0x24, 0x2e, - 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x56, 0x70, 0x6e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x6c, 0x6f, 0x6e, 0x67, 0x56, - 0x70, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x2d, - 0x69, 0x6f, 0x2f, 0x7a, 0x63, 0x6c, 0x69, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x76, 0x70, 0x6e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_zeropsVpnProtocol_proto_rawDescOnce sync.Once - file_zeropsVpnProtocol_proto_rawDescData = file_zeropsVpnProtocol_proto_rawDesc -) - -func file_zeropsVpnProtocol_proto_rawDescGZIP() []byte { - file_zeropsVpnProtocol_proto_rawDescOnce.Do(func() { - file_zeropsVpnProtocol_proto_rawDescData = protoimpl.X.CompressGZIP(file_zeropsVpnProtocol_proto_rawDescData) - }) - return file_zeropsVpnProtocol_proto_rawDescData -} - -var file_zeropsVpnProtocol_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_zeropsVpnProtocol_proto_msgTypes = make([]protoimpl.MessageInfo, 9) -var file_zeropsVpnProtocol_proto_goTypes = []interface{}{ - (ErrorCode)(0), // 0: zeropsVpnProtocol.errorCode - (*Error)(nil), // 1: zeropsVpnProtocol.error - (*IP)(nil), // 2: zeropsVpnProtocol.IP - (*IPRange)(nil), // 3: zeropsVpnProtocol.IPRange - (*Timestamp)(nil), // 4: zeropsVpnProtocol.Timestamp - (*StartVpnRequest)(nil), // 5: zeropsVpnProtocol.startVpnRequest - (*StartVpnResponse)(nil), // 6: zeropsVpnProtocol.startVpnResponse - (*StartVpnOutDto)(nil), // 7: zeropsVpnProtocol.startVpnOutDto - (*ProlongVpnRequest)(nil), // 8: zeropsVpnProtocol.prolongVpnRequest - (*ProlongVpnResponse)(nil), // 9: zeropsVpnProtocol.prolongVpnResponse -} -var file_zeropsVpnProtocol_proto_depIdxs = []int32{ - 0, // 0: zeropsVpnProtocol.error.code:type_name -> zeropsVpnProtocol.errorCode - 1, // 1: zeropsVpnProtocol.startVpnResponse.error:type_name -> zeropsVpnProtocol.error - 7, // 2: zeropsVpnProtocol.startVpnResponse.vpn:type_name -> zeropsVpnProtocol.startVpnOutDto - 2, // 3: zeropsVpnProtocol.startVpnOutDto.assignedClientIp:type_name -> zeropsVpnProtocol.IP - 2, // 4: zeropsVpnProtocol.startVpnOutDto.serverIp:type_name -> zeropsVpnProtocol.IP - 3, // 5: zeropsVpnProtocol.startVpnOutDto.vpnIpRange:type_name -> zeropsVpnProtocol.IPRange - 2, // 6: zeropsVpnProtocol.startVpnOutDto.dnsIp:type_name -> zeropsVpnProtocol.IP - 1, // 7: zeropsVpnProtocol.prolongVpnResponse.error:type_name -> zeropsVpnProtocol.error - 5, // 8: zeropsVpnProtocol.ZeropsVpnProtocol.startVpn:input_type -> zeropsVpnProtocol.startVpnRequest - 8, // 9: zeropsVpnProtocol.ZeropsVpnProtocol.prolongVpn:input_type -> zeropsVpnProtocol.prolongVpnRequest - 6, // 10: zeropsVpnProtocol.ZeropsVpnProtocol.startVpn:output_type -> zeropsVpnProtocol.startVpnResponse - 9, // 11: zeropsVpnProtocol.ZeropsVpnProtocol.prolongVpn:output_type -> zeropsVpnProtocol.prolongVpnResponse - 10, // [10:12] is the sub-list for method output_type - 8, // [8:10] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name -} - -func init() { file_zeropsVpnProtocol_proto_init() } -func file_zeropsVpnProtocol_proto_init() { - if File_zeropsVpnProtocol_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_zeropsVpnProtocol_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IP); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IPRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Timestamp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartVpnRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartVpnResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartVpnOutDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProlongVpnRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsVpnProtocol_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProlongVpnResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_zeropsVpnProtocol_proto_rawDesc, - NumEnums: 1, - NumMessages: 9, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_zeropsVpnProtocol_proto_goTypes, - DependencyIndexes: file_zeropsVpnProtocol_proto_depIdxs, - EnumInfos: file_zeropsVpnProtocol_proto_enumTypes, - MessageInfos: file_zeropsVpnProtocol_proto_msgTypes, - }.Build() - File_zeropsVpnProtocol_proto = out.File - file_zeropsVpnProtocol_proto_rawDesc = nil - file_zeropsVpnProtocol_proto_goTypes = nil - file_zeropsVpnProtocol_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ZeropsVpnProtocolClient is the client API for ZeropsVpnProtocol service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ZeropsVpnProtocolClient interface { - StartVpn(ctx context.Context, in *StartVpnRequest, opts ...grpc.CallOption) (*StartVpnResponse, error) - ProlongVpn(ctx context.Context, in *ProlongVpnRequest, opts ...grpc.CallOption) (*ProlongVpnResponse, error) -} - -type zeropsVpnProtocolClient struct { - cc grpc.ClientConnInterface -} - -func NewZeropsVpnProtocolClient(cc grpc.ClientConnInterface) ZeropsVpnProtocolClient { - return &zeropsVpnProtocolClient{cc} -} - -func (c *zeropsVpnProtocolClient) StartVpn(ctx context.Context, in *StartVpnRequest, opts ...grpc.CallOption) (*StartVpnResponse, error) { - out := new(StartVpnResponse) - err := c.cc.Invoke(ctx, "/zeropsVpnProtocol.ZeropsVpnProtocol/startVpn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zeropsVpnProtocolClient) ProlongVpn(ctx context.Context, in *ProlongVpnRequest, opts ...grpc.CallOption) (*ProlongVpnResponse, error) { - out := new(ProlongVpnResponse) - err := c.cc.Invoke(ctx, "/zeropsVpnProtocol.ZeropsVpnProtocol/prolongVpn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ZeropsVpnProtocolServer is the server API for ZeropsVpnProtocol service. -type ZeropsVpnProtocolServer interface { - StartVpn(context.Context, *StartVpnRequest) (*StartVpnResponse, error) - ProlongVpn(context.Context, *ProlongVpnRequest) (*ProlongVpnResponse, error) -} - -// UnimplementedZeropsVpnProtocolServer can be embedded to have forward compatible implementations. -type UnimplementedZeropsVpnProtocolServer struct { -} - -func (*UnimplementedZeropsVpnProtocolServer) StartVpn(context.Context, *StartVpnRequest) (*StartVpnResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartVpn not implemented") -} -func (*UnimplementedZeropsVpnProtocolServer) ProlongVpn(context.Context, *ProlongVpnRequest) (*ProlongVpnResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProlongVpn not implemented") -} - -func RegisterZeropsVpnProtocolServer(s *grpc.Server, srv ZeropsVpnProtocolServer) { - s.RegisterService(&_ZeropsVpnProtocol_serviceDesc, srv) -} - -func _ZeropsVpnProtocol_StartVpn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartVpnRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZeropsVpnProtocolServer).StartVpn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zeropsVpnProtocol.ZeropsVpnProtocol/StartVpn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZeropsVpnProtocolServer).StartVpn(ctx, req.(*StartVpnRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZeropsVpnProtocol_ProlongVpn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProlongVpnRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZeropsVpnProtocolServer).ProlongVpn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zeropsVpnProtocol.ZeropsVpnProtocol/ProlongVpn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZeropsVpnProtocolServer).ProlongVpn(ctx, req.(*ProlongVpnRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _ZeropsVpnProtocol_serviceDesc = grpc.ServiceDesc{ - ServiceName: "zeropsVpnProtocol.ZeropsVpnProtocol", - HandlerType: (*ZeropsVpnProtocolServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "startVpn", - Handler: _ZeropsVpnProtocol_StartVpn_Handler, - }, - { - MethodName: "prolongVpn", - Handler: _ZeropsVpnProtocol_ProlongVpn_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "zeropsVpnProtocol.proto", -} diff --git a/src/proto/vpnproxy/zeropsVpnProtocol.proto b/src/proto/vpnproxy/zeropsVpnProtocol.proto deleted file mode 100644 index 9ff825dc..00000000 --- a/src/proto/vpnproxy/zeropsVpnProtocol.proto +++ /dev/null @@ -1,70 +0,0 @@ -syntax = "proto3"; - -option go_package = "github.com/zeropsio/zcli/src/protocol/vpnproxy"; - -package zeropsVpnProtocol; - -service ZeropsVpnProtocol { - rpc startVpn (startVpnRequest) returns (startVpnResponse); - rpc prolongVpn (prolongVpnRequest) returns (prolongVpnResponse); -} - -message error { - errorCode code = 1; - string message = 2; -} - -enum errorCode { - NO_ERROR = 0; - INTERNAL_SERVER_ERROR = 1; - INSTANCE_NOT_FOUND = 2; - PROXY_IS_FULL = 3; - INVALID_ACCESS_TOKEN = 4; - VPN_SESSION_EXPIRED = 5; - MAX_PARALLEL_VPN_LIMIT = 6; - INVALID_PREFERRED_PORT = 7; - PREFERRED_PORT_UNAVAILABLE = 8; -} - -message IP { - bytes address = 1; -} - -message IPRange { - bytes ip = 1; - bytes mask = 2; -} - -message Timestamp { - bool isSet = 1; - int64 seconds = 2; - int32 nanos = 3; -} - -message startVpnRequest { - string accessToken = 1; - uint32 preferredPortMin = 2; - uint32 preferredPortMax = 3; -} - -message startVpnResponse { - error error = 1; - startVpnOutDto vpn = 2; -} - -message startVpnOutDto { - int64 port = 1; - string serverPublicKey = 2; - IP assignedClientIp = 3; - IP serverIp = 4; - IPRange vpnIpRange = 5; - IP dnsIp = 6; -} - -message prolongVpnRequest { - string accessToken = 1; -} - -message prolongVpnResponse { - error error = 1; -} diff --git a/src/proto/zBusinessZeropsApiProtocol/build-pb b/src/proto/zBusinessZeropsApiProtocol/build-pb deleted file mode 100755 index 362d771c..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/build-pb +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -protoc \ - -I . \ - -I ../../../include/ \ - --go_opt=paths=source_relative \ - --go_out=paths=source_relative:. \ - --go-grpc_out=paths=source_relative:. \ - *.proto - -if [ $? -ne 0 ]; then - echo FAIL - exit 1 -fi diff --git a/src/proto/zBusinessZeropsApiProtocol/build-pb-generate.go b/src/proto/zBusinessZeropsApiProtocol/build-pb-generate.go deleted file mode 100644 index ff7030c1..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/build-pb-generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package zBusinessZeropsApiProtocol - -//go:generate gomodrun /bin/bash build-pb diff --git a/src/proto/zBusinessZeropsApiProtocol/client.go b/src/proto/zBusinessZeropsApiProtocol/client.go deleted file mode 100644 index 19d3af98..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/client.go +++ /dev/null @@ -1,100 +0,0 @@ -package zBusinessZeropsApiProtocol - -import ( - "context" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" - "strings" - - "golang.org/x/oauth2" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/oauth" - "google.golang.org/grpc/security/advancedtls" - - "github.com/zeropsio/zcli/src/proto/unary" -) - -type Config struct { - CaCertificateUrl string -} - -type Handler struct { - config Config -} - -func New( - config Config, -) *Handler { - return &Handler{ - config: config, - } -} - -func (h *Handler) CreateClient(ctx context.Context, grpcApiAddress string, token string) (_ ZBusinessZeropsApiProtocolClient, closeFunc func(), err error) { - tlsCreds, err := h.createTLSCredentials() - if err != nil { - return nil, nil, err - } - connection, err := grpc.DialContext( - ctx, - grpcApiAddress, - grpc.WithPerRPCCredentials(h.createBearerCredentials(token)), - grpc.WithTransportCredentials(tlsCreds), - grpc.WithChainUnaryInterceptor(unary.TimeoutInterceptor, unary.SupportInterceptor(IsInternal)), - ) - - if err != nil { - return - } - - closeFunc = func() { _ = connection.Close() } - - return NewZBusinessZeropsApiProtocolClient(connection), closeFunc, nil - -} - -const serverNamePrefix = "zbusinessapi" - -func verifyPeerServerName(p *advancedtls.VerificationFuncParams) (*advancedtls.VerificationResults, error) { - if p.Leaf == nil { - return nil, fmt.Errorf("missing leaf certificate") - } - for _, name := range p.Leaf.DNSNames { - if strings.HasPrefix(name, serverNamePrefix) { - return &advancedtls.VerificationResults{}, nil - } - } - return nil, fmt.Errorf("certificate is valid for prefix %s, got %s", serverNamePrefix, p.Leaf.DNSNames) -} - -func (h *Handler) createBearerCredentials(token string) credentials.PerRPCCredentials { - return oauth.NewOauthAccess(&oauth2.Token{AccessToken: token, TokenType: "Bearer"}) -} - -func (h *Handler) createTLSCredentials() (credentials.TransportCredentials, error) { - resp, err := http.Get(h.config.CaCertificateUrl) - if err != nil { - return nil, fmt.Errorf("get caCertificate => %s", err.Error()) - } - defer resp.Body.Close() - caCertBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("read caCertificate response => %s", err.Error()) - } - - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(caCertBytes) { - return nil, fmt.Errorf("failed to add server CA certificate") - } - - return advancedtls.NewClientCreds(&advancedtls.ClientOptions{ - RootOptions: advancedtls.RootCertificateOptions{ - RootCACerts: certPool, - }, - VerifyPeer: verifyPeerServerName, - VType: advancedtls.CertVerification, - }) -} diff --git a/src/proto/zBusinessZeropsApiProtocol/protocol_extra.go b/src/proto/zBusinessZeropsApiProtocol/protocol_extra.go deleted file mode 100644 index c2af2266..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/protocol_extra.go +++ /dev/null @@ -1,31 +0,0 @@ -package zBusinessZeropsApiProtocol - -import ( - "time" -) - -func ToProtoTimestamp(t time.Time) *Timestamp { - if t.IsZero() { - return &Timestamp{} - } - return &Timestamp{IsSet: true, Seconds: t.Unix(), Nanos: int32(t.Nanosecond())} -} - -func FromProtoTimestamp(t *Timestamp) time.Time { - if !t.GetIsSet() { - return time.Time{} - } - return time.Unix(t.GetSeconds(), int64(t.GetNanos())) -} - -func IsInternal(resp interface{}) bool { - errorGetter, ok := resp.(interface{ GetError() *Error }) - if !ok { - return true - } - return errorGetter.GetError().GetCode() == ErrorCode_INTERNAL_SERVER_ERROR -} - -func (x *Error) GetCodeInt() int { - return int(x.GetCode()) -} diff --git a/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.pb.go b/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.pb.go deleted file mode 100644 index 96072c1c..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.pb.go +++ /dev/null @@ -1,17302 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.3 -// source: zeropsApiProtocol.proto - -package zBusinessZeropsApiProtocol - -import ( - reflect "reflect" - sync "sync" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type ErrorCode int32 - -const ( - ErrorCode_NO_ERROR ErrorCode = 0 - ErrorCode_INTERNAL_SERVER_ERROR ErrorCode = 1 - ErrorCode_NOT_FOUND ErrorCode = 326 - ErrorCode_INVALID_USER_INPUT ErrorCode = 2 - ErrorCode_INVALID_USER_INPUT_WITH_TEXT ErrorCode = 3 - ErrorCode_NOT_AUTHORIZED ErrorCode = 4 - ErrorCode_INSUFFICIENT_PRIVILEGES ErrorCode = 5 - ErrorCode_REFRESH_TOKEN_INVALID ErrorCode = 6 - ErrorCode_ENDPOINT_NOT_FOUND ErrorCode = 7 - ErrorCode_POTENTIALLY_FRAUD_BEHAVIOR_DETECTED ErrorCode = 8 - ErrorCode_RE_CAPTCHA_RESPONSE_INVALID ErrorCode = 9 - ErrorCode_DOWNLOAD_TOKEN_INVALID_OR_EXPIRED ErrorCode = 10 - ErrorCode_INCORRECT_USER_CREDENTIALS ErrorCode = 11 - ErrorCode_NO_RIGHTS_TO_SELECTED_ACTION ErrorCode = 12 - ErrorCode_FILE_SIZE_LIMIT_EXCEEDED ErrorCode = 13 - ErrorCode_ADDITIONAL_VERIFICATION_FAILED ErrorCode = 14 - ErrorCode_AT_LEAST_ONE_MANAGER ErrorCode = 191 - ErrorCode_ACTIVE_USER_MUST_BE_CONNECTED_TO_AT_LEAST_ONE_CLIENT ErrorCode = 15 - ErrorCode_INVALID_CREDENTIALS ErrorCode = 16 - ErrorCode_PASSWORD_TOO_SHORT ErrorCode = 270 - ErrorCode_PASSWORD_TOO_LONG ErrorCode = 269 - ErrorCode_NO_ACTIVE_CONNECTION_TO_ANY_CLIENT ErrorCode = 18 - ErrorCode_NO_ACTIVE_CONNECTION_TO_CURRENT_CLIENT ErrorCode = 19 - ErrorCode_TOKEN_EXPIRED ErrorCode = 20 - ErrorCode_CLIENT_NOT_FOUND ErrorCode = 21 - ErrorCode_NO_ACCESS_TO_ZEROPS ErrorCode = 22 - ErrorCode_USER_NOT_FOUND ErrorCode = 23 - ErrorCode_INVALID_DOCUMENT_ROOT ErrorCode = 24 - ErrorCode_INVALID_ENTRYPOINT ErrorCode = 25 - ErrorCode_INVALID_INIT_COMMANDS ErrorCode = 280 - ErrorCode_DOWNLOAD_EXPIRED ErrorCode = 26 - ErrorCode_MULTIPLE_ACCOUNTS_CONNECTED ErrorCode = 334 - ErrorCode_USER_DATA_NOT_FOUND ErrorCode = 27 - ErrorCode_USER_DATA_KEY_INVALID ErrorCode = 28 - ErrorCode_USER_DATA_CONTENT_INVALID ErrorCode = 29 - ErrorCode_USER_DATA_USE_OF_SYSTEM_KEY ErrorCode = 180 - ErrorCode_USER_DATA_DELETE_FORBIDDEN ErrorCode = 30 - ErrorCode_USER_DATA_DUPLICATE_KEY ErrorCode = 31 - ErrorCode_USER_DATA_SYNC_RUNNING ErrorCode = 32 - ErrorCode_USER_DATA_VERSION_MISMATCH ErrorCode = 168 - ErrorCode_USER_TOKEN_NOT_FOUND ErrorCode = 227 - ErrorCode_USER_ACCOUNT_NOT_FOUND ErrorCode = 34 - ErrorCode_TEMPLATE_NOT_FOUND ErrorCode = 35 - ErrorCode_COUNTRY_CALLING_CODE_DOES_NOT_MATCH_PHONE_NUMBER ErrorCode = 36 - ErrorCode_INVALID_PHONE_NUMBER ErrorCode = 37 - ErrorCode_INVALID_USER_ROLE ErrorCode = 38 - ErrorCode_INVALID_CLIENT_USER_GROUP_COMBINATION ErrorCode = 39 - ErrorCode_EMAIL_EXISTS ErrorCode = 40 - ErrorCode_USER_ALREADY_CONNECTED_TO_COMPANY ErrorCode = 41 - ErrorCode_COUNTRY_NOT_FOUND ErrorCode = 42 - ErrorCode_RECORD_NOT_FOUND ErrorCode = 43 - ErrorCode_MAXIMUM_NUMBER_OF_CLIENT_EXCEEDED ErrorCode = 44 - ErrorCode_USER_IS_NOT_IN_BEING_DELETED_STATUS ErrorCode = 45 - ErrorCode_UNABLE_TO_DELETE_YOUR_OWN_ACCOUNT ErrorCode = 46 - ErrorCode_CLIENT_USER_CONNECTION_NOT_FOUND ErrorCode = 47 - ErrorCode_CLIENT_USER_CONNECTION_HAS_BEEN_DELETED ErrorCode = 48 - ErrorCode_BAD_OR_EXPIRED_ACTIVATION_LINK ErrorCode = 49 - ErrorCode_UNABLE_TO_EDIT_DELETED_USER ErrorCode = 50 - ErrorCode_CLIENT_USER_ALREADY_BEEN_DELETED ErrorCode = 51 - ErrorCode_LANGUAGE_NOT_FOUND ErrorCode = 52 - ErrorCode_LANGUAGE_NOT_SUPPORTED ErrorCode = 53 - ErrorCode_DUPLICATED_USER ErrorCode = 54 - ErrorCode_RECORD_IS_READ_ONLY ErrorCode = 55 - ErrorCode_RECORD_IS_DELETED ErrorCode = 56 - ErrorCode_RECORD_COMMON_KEY_EDIT ErrorCode = 57 - ErrorCode_SERVICE_STACK_NOT_FOUND ErrorCode = 61 - ErrorCode_SERVICE_STACK_TYPE_NOT_FOUND ErrorCode = 62 - ErrorCode_SERVICE_STACK_TYPE_VERSION_NOT_FOUND ErrorCode = 63 - ErrorCode_SERVICE_STACK_TYPE_VERSION_IS_NOT_ACTIVE ErrorCode = 64 - ErrorCode_SERVICE_STACK_TYPE_VERSION_REMOVE_DEFAULT ErrorCode = 65 - ErrorCode_SERVICE_STACK_TYPE_INVALID_VERSION ErrorCode = 66 - ErrorCode_SERVICE_STACK_IS_FAILED ErrorCode = 67 - ErrorCode_SERVICE_STACK_IS_SYSTEM_NOT_SUPPORTED ErrorCode = 68 - ErrorCode_SERVICE_STACK_CUSTOM_PORTS_ENABLED_REQUIRED ErrorCode = 69 - ErrorCode_SERVICE_STACK_TYPE_VERSION_NOT_MATCH_WITH_STACK_TYPE ErrorCode = 70 - ErrorCode_SERVICE_STACK_STORAGE_DISK_MAX_LIMIT ErrorCode = 71 - ErrorCode_SERVICE_STACK_STORAGE_DISK_MIN_LIMIT ErrorCode = 72 - ErrorCode_SERVICE_STACK_OBJECT_STORAGE_QUOTA_NOT_FOUND ErrorCode = 73 - ErrorCode_SERVICE_STACK_INIT_COMMANDS_NOT_FOUND ErrorCode = 281 - ErrorCode_SERVICE_STACK_TYPE_OBJECT_STORAGE_REQUIRED ErrorCode = 74 - ErrorCode_SERVICE_STACK_TYPE_OBJECT_STORAGE_FORBIDDEN ErrorCode = 75 - ErrorCode_SERVICE_STACK_TYPE_SHARED_STORAGE_FORBIDDEN ErrorCode = 76 - ErrorCode_SERVICE_STACK_TYPE_STANDARD_FORBIDDEN ErrorCode = 242 - ErrorCode_SERVICE_STACK_IS_READY_TO_DEPLOY ErrorCode = 77 - ErrorCode_SERVICE_STACK_IS_NOT_HTTP ErrorCode = 78 - ErrorCode_SERVICE_STACK_RELOAD_NOT_AVAILABLE ErrorCode = 79 - ErrorCode_SERVICE_STACK_NGINX_CONFIG ErrorCode = 194 - ErrorCode_SERVICE_STACK_SUBDOMAIN_ACCESS_ALREADY_DISABLED ErrorCode = 81 - ErrorCode_SERVICE_STACK_CREATING ErrorCode = 178 - ErrorCode_SERVICE_STACK_UPGRADING ErrorCode = 179 - ErrorCode_SERVICE_STACK_INVALID_CATEGORY ErrorCode = 203 - ErrorCode_SERVICE_STACK_STATUS_NOT_SUPPORTED ErrorCode = 265 - ErrorCode_SERVICE_STACK_USER_NAME_INVALID ErrorCode = 282 - ErrorCode_ACTIVE_SERVICE_STACK_REQUIRED ErrorCode = 283 - ErrorCode_USER_APPLICATION_RUNTIME_SERVICE_STACK_REQUIRED ErrorCode = 284 - ErrorCode_SHARED_STORAGE_NONEMPTY_CONNECTED_STACKS_FORBIDDEN ErrorCode = 329 - ErrorCode_SHARED_STORAGE_SERVICE_STACK_INACTIVE ErrorCode = 328 - ErrorCode_PROCESS_NOT_FOUND ErrorCode = 82 - ErrorCode_PROCESS_IS_ALREADY_OVER ErrorCode = 83 - ErrorCode_PROCESS_IS_ALREADY_RUNNING ErrorCode = 85 - ErrorCode_UNABLE_TO_CREATE_PROCESS ErrorCode = 87 - ErrorCode_CREATE_PROCESS_QUEUED_PROJECT_PROCESS_COUNT_EXCEEDED ErrorCode = 323 - ErrorCode_MANUAL_REPAIR_REQUIRED ErrorCode = 59 - ErrorCode_NOTHING_TO_SYNC ErrorCode = 60 - ErrorCode_IS_NOT_POSSIBLE_TO_EDIT_ANOTHER_USER ErrorCode = 58 - ErrorCode_ACTIVE_SERVICE_STACK_EXISTS_IN_PROJECT ErrorCode = 88 - ErrorCode_INVALID_OLD_PASSWORD ErrorCode = 89 - ErrorCode_PROJECT_STATUS_NOT_SUPPORTED ErrorCode = 90 - ErrorCode_PROJECT_NOT_FOUND ErrorCode = 91 - ErrorCode_PROJECT_IS_NOT_ACTIVE ErrorCode = 167 - ErrorCode_SERVICE_STACK_NAME_UNAVAILABLE ErrorCode = 92 - ErrorCode_SERVICE_STACK_NAME_INVALID ErrorCode = 93 - ErrorCode_CORE_SERVICE_STACK_TYPE_VERSION_NOT_FOUND ErrorCode = 94 - ErrorCode_L7_HTTP_BALANCER_SERVICE_STACK_TYPE_VERSION_NOT_FOUND ErrorCode = 95 - ErrorCode_PROJECT_WILL_BE_DELETED ErrorCode = 96 - ErrorCode_PROJECT_WILL_BE_STARTED ErrorCode = 256 - ErrorCode_PROJECT_WILL_BE_STOPPED ErrorCode = 257 - ErrorCode_STACK_WILL_BE_DELETED ErrorCode = 97 - ErrorCode_STACK_OF_PROJECT_WILL_BE_DELETED ErrorCode = 286 - ErrorCode_STACK_OF_PROJECT_WILL_BE_CREATED ErrorCode = 287 - ErrorCode_USER_DATA_OF_PROJECT_WILL_BE_SYNCED ErrorCode = 288 - ErrorCode_PUBLIC_HTTP_ROUTING_NOT_FOUND ErrorCode = 98 - ErrorCode_PUBLIC_HTTP_ROUTING_AT_LEAST_ONE_DOMAIN_REQUIRED ErrorCode = 99 - ErrorCode_PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME ErrorCode = 100 - ErrorCode_PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK ErrorCode = 101 - ErrorCode_PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME_IN_ANOTHER_ROUTING ErrorCode = 102 - ErrorCode_PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK_IN_ANOTHER_ROUTING ErrorCode = 103 - ErrorCode_PUBLIC_HTTP_ROUTING_DUPLICATE_LOCATION_PATHS ErrorCode = 104 - ErrorCode_PUBLIC_HTTP_ROUTING_ITEMS_LIMIT ErrorCode = 105 - ErrorCode_PUBLIC_HTTP_ROUTING_LOCATIONS_LIMIT ErrorCode = 106 - ErrorCode_PUBLIC_HTTP_ROUTING_DOMAINS_LIMIT ErrorCode = 107 - ErrorCode_PUBLIC_HTTP_ROUTING_INVALID_DOMAIN_NAME_FQDN ErrorCode = 108 - ErrorCode_PUBLIC_HTTP_ROUTING_SSL_FALLBACK ErrorCode = 109 - ErrorCode_PUBLIC_HTTP_ROUTING_LOCATION_DOES_NOT_FOUND ErrorCode = 110 - ErrorCode_PUBLIC_HTTP_ROUTING_INVALID_LOCATIONS_PREFIX ErrorCode = 111 - ErrorCode_PUBLIC_HTTP_ROUTING_MULTIPLE_SERVICE_STACK_ACCESS_POINTS ErrorCode = 112 - ErrorCode_PUBLIC_HTTP_ROUTING_SERVICE_STACK_ACCESS_POINT_NOT_FOUND ErrorCode = 113 - ErrorCode_PUBLIC_HTTP_ROUTING_REQUEST_ONLY_TCP_PORT ErrorCode = 114 - ErrorCode_PUBLIC_HTTP_ROUTING_SERVICE_STACK_DOES_NOT_SUPPORT_HTTP ErrorCode = 115 - ErrorCode_PUBLIC_HTTP_ROUTING_FORBIDDEN_ZEROPS_SUBDOMAIN_SUFFIX ErrorCode = 327 - ErrorCode_NO_PUBLIC_HTTP_ROUTING_IN_L7_HTTP_BALANCING ErrorCode = 116 - ErrorCode_SSL_NOT_SUPPORTED ErrorCode = 117 - ErrorCode_REGISTERED_DOMAIN_HOST_LIMIT_REACHED ErrorCode = 118 - ErrorCode_PUBLIC_SUFFIX_LIST_CONTROL_FAILED ErrorCode = 119 - ErrorCode_PORT_NOT_SUPPORTED ErrorCode = 120 - ErrorCode_PUBLIC_HTTP_ROUTING_SYNC_RUNNING ErrorCode = 121 - ErrorCode_PUBLIC_HTTP_ROUTING_VERSION_MISMATCH ErrorCode = 169 - ErrorCode_PORT_OUT_OF_RANGE ErrorCode = 122 - ErrorCode_PORT_PROTOCOL_INVALID ErrorCode = 123 - ErrorCode_PORT_SCHEME_INVALID ErrorCode = 124 - ErrorCode_UDP_PROTOCOL_SCHEME_MISMATCH ErrorCode = 125 - ErrorCode_PUBLIC_IP_REQUEST_NOT_FOUND ErrorCode = 126 - ErrorCode_PUBLIC_IP_REQUEST_ONLY_ONE ErrorCode = 128 - ErrorCode_PUBLIC_IP_REQUEST_RELEASE_RUNNING ErrorCode = 130 - ErrorCode_USER_NOTIFICATION_NOT_FOUND ErrorCode = 131 - ErrorCode_PUBLIC_PORT_ROUTING_NOT_FOUND ErrorCode = 132 - ErrorCode_PUBLIC_IP_TYPE_NOT_SUPPORTED ErrorCode = 133 - ErrorCode_PORT_AND_PROTOCOL_COMBINATION_NOT_SUPPORTED ErrorCode = 134 - ErrorCode_PUBLIC_PORT_ROUTING_DUPLICATE_RULE ErrorCode = 135 - ErrorCode_INTERNAL_PORT_DUPLICATE_RULE ErrorCode = 181 - ErrorCode_PUBLIC_PORT_ROUTING_SYNC_RUNNING ErrorCode = 136 - ErrorCode_PUBLIC_PORT_ROUTING_INVALID_IP_FORMAT ErrorCode = 137 - ErrorCode_PUBLIC_PORT_ROUTING_FIREWALL_POLICY_CONFLICT ErrorCode = 138 - ErrorCode_PUBLIC_PORT_ROUTING_VERSION_MISMATCH ErrorCode = 170 - ErrorCode_PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_DELETED_RECORD ErrorCode = 139 - ErrorCode_PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_PORTS_ON_SYSTEM_SERVICE ErrorCode = 190 - ErrorCode_DRIVER_NOT_FOUND ErrorCode = 140 - ErrorCode_DRIVER_ENTITY_IS_NOT_SERVICE_STACK ErrorCode = 141 - ErrorCode_DRIVER_ALREADY_SET ErrorCode = 142 - ErrorCode_CLIENT_USER_CONNECTION_ALREADY_EXISTS ErrorCode = 143 - ErrorCode_USER_ALREADY_ASSIGNED ErrorCode = 144 - ErrorCode_SERVICE_STACK_TYPE_USER_STORAGE_REQUIRED ErrorCode = 145 - ErrorCode_APP_VERSION_NOT_FOUND ErrorCode = 146 - ErrorCode_APP_VERSION_INVALID_STATUS ErrorCode = 147 - ErrorCode_DEPLOY_PROCESS_ALREADY_CREATED ErrorCode = 148 - ErrorCode_OBJECT_CONTENT_LENGTH_ZERO ErrorCode = 149 - ErrorCode_OBJECT_MIME_TYPE_NOT_SUPPORTED ErrorCode = 150 - ErrorCode_OBJECT_NOT_FOUND ErrorCode = 151 - ErrorCode_MAX_OBJECT_DISK_SIZE_ESTIMATE_EXCEEDED ErrorCode = 152 - ErrorCode_APP_VERSION_IS_ACTIVE ErrorCode = 226 - ErrorCode_APP_VERSION_NO_ACTIVE_FOUND ErrorCode = 310 - ErrorCode_APP_VERSION_IS_BEING_DEPLOYED ErrorCode = 196 - ErrorCode_APP_VERSION_IS_BEING_BUILT ErrorCode = 197 - ErrorCode_APP_VERSION_IS_NOT_BEING_UPLOADED ErrorCode = 198 - ErrorCode_APP_VERSION_DEPLOYING_FAILED ErrorCode = 199 - ErrorCode_APP_VERSION_BUILDING_FAILED ErrorCode = 200 - ErrorCode_APP_VERSION_YAML_PARSE_FAILED ErrorCode = 225 - ErrorCode_APP_VERSION_YAML_CONFIG_REQUIRED ErrorCode = 324 - ErrorCode_APP_VERSION_DATA_NOT_AVAILABLE ErrorCode = 285 - ErrorCode_APP_VERSION_ACTIVE_HAS_DEFAULT_RUNTIME ErrorCode = 306 - ErrorCode_SHARED_STORAGE_NOT_FOUND ErrorCode = 153 - ErrorCode_SHARED_STORAGE_INVALID_PROJECT ErrorCode = 154 - ErrorCode_SERVICE_STACK_CONNECTION_NOT_FOUND ErrorCode = 155 - ErrorCode_SHARED_STORAGE_INVALID_CATEGORY ErrorCode = 156 - ErrorCode_USER_SERVICE_STACK_INVALID_CATEGORY ErrorCode = 157 - ErrorCode_IDENTICAL_SHARED_STORAGE_AND_SERVICE_STACK ErrorCode = 158 - ErrorCode_CLIENT_ID_PROJECT_SERVICE_STACK_MISSING ErrorCode = 159 - ErrorCode_DIFFERENT_PROJECT_IDS ErrorCode = 160 - ErrorCode_STATS_HISTORY_SEARCH_LIMIT_INVALID ErrorCode = 171 - ErrorCode_STATS_HISTORY_SEARCH_TIME_GROUP_BY_INVALID ErrorCode = 192 - ErrorCode_STATS_HISTORY_SEARCH_ID_FILTER_INVALID ErrorCode = 172 - ErrorCode_STATS_HISTORY_SEARCH_PROJECT_ID_REQUIRED ErrorCode = 173 - ErrorCode_STATS_HISTORY_SEARCH_SUBSCRIPTION_NOT_SUPPORTED ErrorCode = 174 - ErrorCode_STATS_HISTORY_SEARCH_HISTORY_LIMIT_REACHED ErrorCode = 193 - ErrorCode_STATS_HISTORY_SEARCH_RANGE_INVALID ErrorCode = 274 - ErrorCode_STATS_HISTORY_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED ErrorCode = 278 - ErrorCode_STATS_HISTORY_SEARCH_FULL_RANGE_REQUIRED ErrorCode = 276 - ErrorCode_TRANSACTION_DEBIT_SEARCH_LIMIT_INVALID ErrorCode = 260 - ErrorCode_TRANSACTION_DEBIT_SEARCH_TIME_GROUP_BY_INVALID ErrorCode = 261 - ErrorCode_TRANSACTION_DEBIT_SEARCH_RANGE_INVALID ErrorCode = 273 - ErrorCode_TRANSACTION_DEBIT_SEARCH_CLIENT_ID_REQUIRED ErrorCode = 262 - ErrorCode_TRANSACTION_DEBIT_SEARCH_ID_FILTER_INVALID ErrorCode = 263 - ErrorCode_TRANSACTION_DEBIT_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED ErrorCode = 277 - ErrorCode_TRANSACTION_DEBIT_SEARCH_FULL_RANGE_REQUIRED ErrorCode = 272 - ErrorCode_TRANSACTION_DEBIT_SEARCH_TILL_AND_FROM_DATE_TIMEZONES_DIFFER ErrorCode = 300 - ErrorCode_TRANSACTION_DEBIT_SEARCH_UNKNOWN_TIMEZONE ErrorCode = 301 - ErrorCode_TRANSACTION_DEBIT_SEARCH_INVALID_FILTER ErrorCode = 271 - ErrorCode_GITHUB_VERIFICATION_EXPIRED ErrorCode = 188 - ErrorCode_INVALID_GITHUB_TOKEN_ACTION ErrorCode = 182 - ErrorCode_GITHUB_REQUEST_FAILED ErrorCode = 183 - ErrorCode_GITHUB_AUTHORIZATION_REQUIRED ErrorCode = 184 - ErrorCode_GITHUB_EMAIL_ACCESS_REQUIRED ErrorCode = 185 - ErrorCode_GITHUB_NO_VERIFIED_EMAIL_FOUND ErrorCode = 186 - ErrorCode_GITHUB_REPOSITORY_ACCESS_REQUIRED ErrorCode = 187 - ErrorCode_GITHUB_RATE_LIMIT_EXCEEDED ErrorCode = 189 - ErrorCode_SERVICE_STACK_NO_GITHUB_INTEGRATION ErrorCode = 206 - ErrorCode_BRANCH_NAME_REQUIRED ErrorCode = 207 - ErrorCode_TRIGGER_BUILD_REQUIRES_BRANCH_EVENT_TYPE ErrorCode = 268 - ErrorCode_USER_SERVICE_STACK_REQUIRED ErrorCode = 208 - ErrorCode_NO_EXTERNAL_REPOSITORY_INTEGRATION ErrorCode = 209 - ErrorCode_GITHUB_BRANCH_DELETED ErrorCode = 210 - ErrorCode_GITHUB_WEBHOOK_DELETED ErrorCode = 211 - ErrorCode_GITHUB_WEBHOOK_INVALID_PARAMETERS ErrorCode = 212 - ErrorCode_UNEXPECTED_GITHUB_FILE_ENCODING ErrorCode = 218 - ErrorCode_ZEROPS_BUILD_FILE_NOT_FOUND ErrorCode = 219 - ErrorCode_INCORRECT_WEBHOOK_SECRET ErrorCode = 213 - ErrorCode_UNSUPPORTED_WEBHOOK_EVENT_TYPE ErrorCode = 214 - ErrorCode_REPOSITORY_DOES_NOT_MATCH_SERVICE_STACK_SETTINGS ErrorCode = 215 - ErrorCode_PROJECT_STATUS_NOT_IN_NEW_CREATING_ACTIVE ErrorCode = 216 - ErrorCode_GITHUB_PUSH_IGNORED ErrorCode = 217 - ErrorCode_ZEROPS_BUILD_FILE_TOO_LARGE ErrorCode = 204 - ErrorCode_SAME_SERVICE_STACK_TYPE_USED ErrorCode = 205 - ErrorCode_GITHUB_WRONG_REPOSITORY_FULL_NAME_FORMAT ErrorCode = 220 - ErrorCode_GITHUB_WEBHOOKS_LIMIT_EXCEEDED ErrorCode = 221 - ErrorCode_AVATAR_UPLOAD_FORBIDDEN_IMAGE_TYPE ErrorCode = 222 - ErrorCode_AVATAR_UPLOAD_MAX_SIZE ErrorCode = 223 - ErrorCode_AVATAR_UPLOAD_FILE_NOT_FOUND ErrorCode = 224 - ErrorCode_GITLAB_RATE_LIMIT_EXCEEDED ErrorCode = 228 - ErrorCode_GITLAB_VERIFICATION_EXPIRED ErrorCode = 229 - ErrorCode_INVALID_GITLAB_TOKEN_ACTION ErrorCode = 230 - ErrorCode_GITLAB_REQUEST_FAILED ErrorCode = 231 - ErrorCode_GITLAB_AUTHORIZATION_REQUIRED ErrorCode = 232 - ErrorCode_GITLAB_FULL_API_ACCESS_REQUIRED ErrorCode = 233 - ErrorCode_MULTIPLE_INTEGRATIONS_ARE_FORBIDDEN ErrorCode = 234 - ErrorCode_GITLAB_BRANCH_DELETED ErrorCode = 235 - ErrorCode_GITLAB_WEBHOOK_DELETED ErrorCode = 236 - ErrorCode_GITLAB_WEBHOOK_INVALID_PARAMETERS ErrorCode = 237 - ErrorCode_SERVICE_STACK_NO_GITLAB_INTEGRATION ErrorCode = 238 - ErrorCode_GITLAB_PUSH_IGNORED ErrorCode = 239 - ErrorCode_YAML_FIELD_LENGTH_ERROR ErrorCode = 240 - ErrorCode_YAML_WRONG_USE_FIELD_TYPE ErrorCode = 241 - ErrorCode_VAT_NUMBER_NOT_IN_EUCOUNTRY ErrorCode = 254 - ErrorCode_COMPANY_NOT_FOUND_IN_EU ErrorCode = 258 - ErrorCode_VAT_NUMBER_MISSING ErrorCode = 244 - ErrorCode_PAYMENT_IN_PROGRESS ErrorCode = 245 - ErrorCode_DUPLICATE_VAT_NUMBER ErrorCode = 250 - ErrorCode_DUPLICATE_COMPANY_NUMBER ErrorCode = 302 - ErrorCode_CURRENCY_CHANGE ErrorCode = 303 - ErrorCode_ADMIN_USER_ACCOUNT_EXISTS ErrorCode = 266 - ErrorCode_CREDIT_LIMIT_REACHED ErrorCode = 246 - ErrorCode_INSUFFICIENT_CREDIT ErrorCode = 247 - ErrorCode_PROJECT_LOCK_FAILED ErrorCode = 248 - ErrorCode_PROJECT_UPDATE_FAILED ErrorCode = 249 - ErrorCode_MAXIMUM_AMOUNT_EXCEEDED ErrorCode = 267 - ErrorCode_PAYMENT_FAILED_ERROR ErrorCode = 252 - ErrorCode_PAYMENT_NOT_FOUND ErrorCode = 253 - ErrorCode_ADDON_NOT_FOUND ErrorCode = 255 - ErrorCode_INVOICE_NOT_FOUND ErrorCode = 259 - ErrorCode_PRICE_LIST_NOT_FOUND ErrorCode = 264 - ErrorCode_COST_LIMIT_TOO_SMALL ErrorCode = 279 - ErrorCode_PROJECT_IMPORT_INVALID_YAML ErrorCode = 289 - ErrorCode_PROJECT_IMPORT_INVALID_CONFIG_STRUCTURE ErrorCode = 290 - ErrorCode_PROJECT_IMPORT_INVALID_PARAMETER ErrorCode = 295 - ErrorCode_PROJECT_IMPORT_INVALID_TYPE_VERSION ErrorCode = 292 - ErrorCode_PROJECT_IMPORT_MISSING_PARAMETER ErrorCode = 293 - ErrorCode_PROJECT_IMPORT_UNABLE_TO_CREATE_SERVICE_STACK ErrorCode = 294 - ErrorCode_PROJECT_IMPORT_PROJECT_INCLUDED ErrorCode = 296 - ErrorCode_PROJECT_IMPORT_PROJECT_MISSING ErrorCode = 297 - ErrorCode_PROJECT_IMPORT_MISSING_SERVICE ErrorCode = 298 - ErrorCode_INVALID_CUSTOM_AUTOSCALING_VALUE ErrorCode = 309 - ErrorCode_INVALID_CUSTOM_AUTOSCALING_CPU_RAM_RATIO ErrorCode = 335 - ErrorCode_CUSTOM_VERTICAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY ErrorCode = 305 - ErrorCode_CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY ErrorCode = 307 - ErrorCode_CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_IN_NON_HA_MODE ErrorCode = 308 - ErrorCode_ACTION_FORBIDDEN_FOR_THIS_STACK_CATEGORY ErrorCode = 311 - ErrorCode_MODE_UPDATE_FORBIDDEN_FOR_THIS_STACK_CATEGORY ErrorCode = 312 - ErrorCode_YAML_VALIDATION_INVALID_YAML ErrorCode = 304 - ErrorCode_UNEXPECTED_YAML_ENCODING ErrorCode = 325 - ErrorCode_BUCKET_ALREADY_EXISTS ErrorCode = 336 - ErrorCode_S3_API_REQUEST_FAILED ErrorCode = 337 - ErrorCode_USER_ID_WAS_NOT_FOUND ErrorCode = 161 - ErrorCode_AUTHOR_ID_WAS_NOT_FOUND ErrorCode = 162 - ErrorCode_USER_DOES_NOT_HAVE_ACTIVE_CONNECTION_TO_ANY_CLIENT ErrorCode = 163 - ErrorCode_USER_HAS_NOT_ACCESS_TO_ZEROPS ErrorCode = 164 - ErrorCode_INVALID_EMAIL_TOKEN ErrorCode = 195 - ErrorCode_CLIENT_CREATE_FAILED ErrorCode = 321 - ErrorCode_CLIENT_ID_TOO_LONG ErrorCode = 322 - ErrorCode_TRANSFER_ID_TOO_LONG ErrorCode = 316 - ErrorCode_EMAIL_IS_INVALID ErrorCode = 313 - ErrorCode_USER_ACCOUNT_DELETED ErrorCode = 314 - ErrorCode_NO_CONTABO_CLIENT_CONNECTED ErrorCode = 315 - ErrorCode_AMBIGUOUS_USER ErrorCode = 330 - ErrorCode_AMBIGUOUS_USER_SIGN_IN ErrorCode = 331 - ErrorCode_UNSUPPORTED_CURRENCY ErrorCode = 317 - ErrorCode_INVALID_CURRENCY_CODE ErrorCode = 320 - ErrorCode_TRANSFER_PARAM_MISMATCH ErrorCode = 318 - ErrorCode_INVALID_AMOUNT ErrorCode = 333 -) - -// Enum value maps for ErrorCode. -var ( - ErrorCode_name = map[int32]string{ - 0: "NO_ERROR", - 1: "INTERNAL_SERVER_ERROR", - 326: "NOT_FOUND", - 2: "INVALID_USER_INPUT", - 3: "INVALID_USER_INPUT_WITH_TEXT", - 4: "NOT_AUTHORIZED", - 5: "INSUFFICIENT_PRIVILEGES", - 6: "REFRESH_TOKEN_INVALID", - 7: "ENDPOINT_NOT_FOUND", - 8: "POTENTIALLY_FRAUD_BEHAVIOR_DETECTED", - 9: "RE_CAPTCHA_RESPONSE_INVALID", - 10: "DOWNLOAD_TOKEN_INVALID_OR_EXPIRED", - 11: "INCORRECT_USER_CREDENTIALS", - 12: "NO_RIGHTS_TO_SELECTED_ACTION", - 13: "FILE_SIZE_LIMIT_EXCEEDED", - 14: "ADDITIONAL_VERIFICATION_FAILED", - 191: "AT_LEAST_ONE_MANAGER", - 15: "ACTIVE_USER_MUST_BE_CONNECTED_TO_AT_LEAST_ONE_CLIENT", - 16: "INVALID_CREDENTIALS", - 270: "PASSWORD_TOO_SHORT", - 269: "PASSWORD_TOO_LONG", - 18: "NO_ACTIVE_CONNECTION_TO_ANY_CLIENT", - 19: "NO_ACTIVE_CONNECTION_TO_CURRENT_CLIENT", - 20: "TOKEN_EXPIRED", - 21: "CLIENT_NOT_FOUND", - 22: "NO_ACCESS_TO_ZEROPS", - 23: "USER_NOT_FOUND", - 24: "INVALID_DOCUMENT_ROOT", - 25: "INVALID_ENTRYPOINT", - 280: "INVALID_INIT_COMMANDS", - 26: "DOWNLOAD_EXPIRED", - 334: "MULTIPLE_ACCOUNTS_CONNECTED", - 27: "USER_DATA_NOT_FOUND", - 28: "USER_DATA_KEY_INVALID", - 29: "USER_DATA_CONTENT_INVALID", - 180: "USER_DATA_USE_OF_SYSTEM_KEY", - 30: "USER_DATA_DELETE_FORBIDDEN", - 31: "USER_DATA_DUPLICATE_KEY", - 32: "USER_DATA_SYNC_RUNNING", - 168: "USER_DATA_VERSION_MISMATCH", - 227: "USER_TOKEN_NOT_FOUND", - 34: "USER_ACCOUNT_NOT_FOUND", - 35: "TEMPLATE_NOT_FOUND", - 36: "COUNTRY_CALLING_CODE_DOES_NOT_MATCH_PHONE_NUMBER", - 37: "INVALID_PHONE_NUMBER", - 38: "INVALID_USER_ROLE", - 39: "INVALID_CLIENT_USER_GROUP_COMBINATION", - 40: "EMAIL_EXISTS", - 41: "USER_ALREADY_CONNECTED_TO_COMPANY", - 42: "COUNTRY_NOT_FOUND", - 43: "RECORD_NOT_FOUND", - 44: "MAXIMUM_NUMBER_OF_CLIENT_EXCEEDED", - 45: "USER_IS_NOT_IN_BEING_DELETED_STATUS", - 46: "UNABLE_TO_DELETE_YOUR_OWN_ACCOUNT", - 47: "CLIENT_USER_CONNECTION_NOT_FOUND", - 48: "CLIENT_USER_CONNECTION_HAS_BEEN_DELETED", - 49: "BAD_OR_EXPIRED_ACTIVATION_LINK", - 50: "UNABLE_TO_EDIT_DELETED_USER", - 51: "CLIENT_USER_ALREADY_BEEN_DELETED", - 52: "LANGUAGE_NOT_FOUND", - 53: "LANGUAGE_NOT_SUPPORTED", - 54: "DUPLICATED_USER", - 55: "RECORD_IS_READ_ONLY", - 56: "RECORD_IS_DELETED", - 57: "RECORD_COMMON_KEY_EDIT", - 61: "SERVICE_STACK_NOT_FOUND", - 62: "SERVICE_STACK_TYPE_NOT_FOUND", - 63: "SERVICE_STACK_TYPE_VERSION_NOT_FOUND", - 64: "SERVICE_STACK_TYPE_VERSION_IS_NOT_ACTIVE", - 65: "SERVICE_STACK_TYPE_VERSION_REMOVE_DEFAULT", - 66: "SERVICE_STACK_TYPE_INVALID_VERSION", - 67: "SERVICE_STACK_IS_FAILED", - 68: "SERVICE_STACK_IS_SYSTEM_NOT_SUPPORTED", - 69: "SERVICE_STACK_CUSTOM_PORTS_ENABLED_REQUIRED", - 70: "SERVICE_STACK_TYPE_VERSION_NOT_MATCH_WITH_STACK_TYPE", - 71: "SERVICE_STACK_STORAGE_DISK_MAX_LIMIT", - 72: "SERVICE_STACK_STORAGE_DISK_MIN_LIMIT", - 73: "SERVICE_STACK_OBJECT_STORAGE_QUOTA_NOT_FOUND", - 281: "SERVICE_STACK_INIT_COMMANDS_NOT_FOUND", - 74: "SERVICE_STACK_TYPE_OBJECT_STORAGE_REQUIRED", - 75: "SERVICE_STACK_TYPE_OBJECT_STORAGE_FORBIDDEN", - 76: "SERVICE_STACK_TYPE_SHARED_STORAGE_FORBIDDEN", - 242: "SERVICE_STACK_TYPE_STANDARD_FORBIDDEN", - 77: "SERVICE_STACK_IS_READY_TO_DEPLOY", - 78: "SERVICE_STACK_IS_NOT_HTTP", - 79: "SERVICE_STACK_RELOAD_NOT_AVAILABLE", - 194: "SERVICE_STACK_NGINX_CONFIG", - 81: "SERVICE_STACK_SUBDOMAIN_ACCESS_ALREADY_DISABLED", - 178: "SERVICE_STACK_CREATING", - 179: "SERVICE_STACK_UPGRADING", - 203: "SERVICE_STACK_INVALID_CATEGORY", - 265: "SERVICE_STACK_STATUS_NOT_SUPPORTED", - 282: "SERVICE_STACK_USER_NAME_INVALID", - 283: "ACTIVE_SERVICE_STACK_REQUIRED", - 284: "USER_APPLICATION_RUNTIME_SERVICE_STACK_REQUIRED", - 329: "SHARED_STORAGE_NONEMPTY_CONNECTED_STACKS_FORBIDDEN", - 328: "SHARED_STORAGE_SERVICE_STACK_INACTIVE", - 82: "PROCESS_NOT_FOUND", - 83: "PROCESS_IS_ALREADY_OVER", - 85: "PROCESS_IS_ALREADY_RUNNING", - 87: "UNABLE_TO_CREATE_PROCESS", - 323: "CREATE_PROCESS_QUEUED_PROJECT_PROCESS_COUNT_EXCEEDED", - 59: "MANUAL_REPAIR_REQUIRED", - 60: "NOTHING_TO_SYNC", - 58: "IS_NOT_POSSIBLE_TO_EDIT_ANOTHER_USER", - 88: "ACTIVE_SERVICE_STACK_EXISTS_IN_PROJECT", - 89: "INVALID_OLD_PASSWORD", - 90: "PROJECT_STATUS_NOT_SUPPORTED", - 91: "PROJECT_NOT_FOUND", - 167: "PROJECT_IS_NOT_ACTIVE", - 92: "SERVICE_STACK_NAME_UNAVAILABLE", - 93: "SERVICE_STACK_NAME_INVALID", - 94: "CORE_SERVICE_STACK_TYPE_VERSION_NOT_FOUND", - 95: "L7_HTTP_BALANCER_SERVICE_STACK_TYPE_VERSION_NOT_FOUND", - 96: "PROJECT_WILL_BE_DELETED", - 256: "PROJECT_WILL_BE_STARTED", - 257: "PROJECT_WILL_BE_STOPPED", - 97: "STACK_WILL_BE_DELETED", - 286: "STACK_OF_PROJECT_WILL_BE_DELETED", - 287: "STACK_OF_PROJECT_WILL_BE_CREATED", - 288: "USER_DATA_OF_PROJECT_WILL_BE_SYNCED", - 98: "PUBLIC_HTTP_ROUTING_NOT_FOUND", - 99: "PUBLIC_HTTP_ROUTING_AT_LEAST_ONE_DOMAIN_REQUIRED", - 100: "PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME", - 101: "PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK", - 102: "PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME_IN_ANOTHER_ROUTING", - 103: "PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK_IN_ANOTHER_ROUTING", - 104: "PUBLIC_HTTP_ROUTING_DUPLICATE_LOCATION_PATHS", - 105: "PUBLIC_HTTP_ROUTING_ITEMS_LIMIT", - 106: "PUBLIC_HTTP_ROUTING_LOCATIONS_LIMIT", - 107: "PUBLIC_HTTP_ROUTING_DOMAINS_LIMIT", - 108: "PUBLIC_HTTP_ROUTING_INVALID_DOMAIN_NAME_FQDN", - 109: "PUBLIC_HTTP_ROUTING_SSL_FALLBACK", - 110: "PUBLIC_HTTP_ROUTING_LOCATION_DOES_NOT_FOUND", - 111: "PUBLIC_HTTP_ROUTING_INVALID_LOCATIONS_PREFIX", - 112: "PUBLIC_HTTP_ROUTING_MULTIPLE_SERVICE_STACK_ACCESS_POINTS", - 113: "PUBLIC_HTTP_ROUTING_SERVICE_STACK_ACCESS_POINT_NOT_FOUND", - 114: "PUBLIC_HTTP_ROUTING_REQUEST_ONLY_TCP_PORT", - 115: "PUBLIC_HTTP_ROUTING_SERVICE_STACK_DOES_NOT_SUPPORT_HTTP", - 327: "PUBLIC_HTTP_ROUTING_FORBIDDEN_ZEROPS_SUBDOMAIN_SUFFIX", - 116: "NO_PUBLIC_HTTP_ROUTING_IN_L7_HTTP_BALANCING", - 117: "SSL_NOT_SUPPORTED", - 118: "REGISTERED_DOMAIN_HOST_LIMIT_REACHED", - 119: "PUBLIC_SUFFIX_LIST_CONTROL_FAILED", - 120: "PORT_NOT_SUPPORTED", - 121: "PUBLIC_HTTP_ROUTING_SYNC_RUNNING", - 169: "PUBLIC_HTTP_ROUTING_VERSION_MISMATCH", - 122: "PORT_OUT_OF_RANGE", - 123: "PORT_PROTOCOL_INVALID", - 124: "PORT_SCHEME_INVALID", - 125: "UDP_PROTOCOL_SCHEME_MISMATCH", - 126: "PUBLIC_IP_REQUEST_NOT_FOUND", - 128: "PUBLIC_IP_REQUEST_ONLY_ONE", - 130: "PUBLIC_IP_REQUEST_RELEASE_RUNNING", - 131: "USER_NOTIFICATION_NOT_FOUND", - 132: "PUBLIC_PORT_ROUTING_NOT_FOUND", - 133: "PUBLIC_IP_TYPE_NOT_SUPPORTED", - 134: "PORT_AND_PROTOCOL_COMBINATION_NOT_SUPPORTED", - 135: "PUBLIC_PORT_ROUTING_DUPLICATE_RULE", - 181: "INTERNAL_PORT_DUPLICATE_RULE", - 136: "PUBLIC_PORT_ROUTING_SYNC_RUNNING", - 137: "PUBLIC_PORT_ROUTING_INVALID_IP_FORMAT", - 138: "PUBLIC_PORT_ROUTING_FIREWALL_POLICY_CONFLICT", - 170: "PUBLIC_PORT_ROUTING_VERSION_MISMATCH", - 139: "PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_DELETED_RECORD", - 190: "PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_PORTS_ON_SYSTEM_SERVICE", - 140: "DRIVER_NOT_FOUND", - 141: "DRIVER_ENTITY_IS_NOT_SERVICE_STACK", - 142: "DRIVER_ALREADY_SET", - 143: "CLIENT_USER_CONNECTION_ALREADY_EXISTS", - 144: "USER_ALREADY_ASSIGNED", - 145: "SERVICE_STACK_TYPE_USER_STORAGE_REQUIRED", - 146: "APP_VERSION_NOT_FOUND", - 147: "APP_VERSION_INVALID_STATUS", - 148: "DEPLOY_PROCESS_ALREADY_CREATED", - 149: "OBJECT_CONTENT_LENGTH_ZERO", - 150: "OBJECT_MIME_TYPE_NOT_SUPPORTED", - 151: "OBJECT_NOT_FOUND", - 152: "MAX_OBJECT_DISK_SIZE_ESTIMATE_EXCEEDED", - 226: "APP_VERSION_IS_ACTIVE", - 310: "APP_VERSION_NO_ACTIVE_FOUND", - 196: "APP_VERSION_IS_BEING_DEPLOYED", - 197: "APP_VERSION_IS_BEING_BUILT", - 198: "APP_VERSION_IS_NOT_BEING_UPLOADED", - 199: "APP_VERSION_DEPLOYING_FAILED", - 200: "APP_VERSION_BUILDING_FAILED", - 225: "APP_VERSION_YAML_PARSE_FAILED", - 324: "APP_VERSION_YAML_CONFIG_REQUIRED", - 285: "APP_VERSION_DATA_NOT_AVAILABLE", - 306: "APP_VERSION_ACTIVE_HAS_DEFAULT_RUNTIME", - 153: "SHARED_STORAGE_NOT_FOUND", - 154: "SHARED_STORAGE_INVALID_PROJECT", - 155: "SERVICE_STACK_CONNECTION_NOT_FOUND", - 156: "SHARED_STORAGE_INVALID_CATEGORY", - 157: "USER_SERVICE_STACK_INVALID_CATEGORY", - 158: "IDENTICAL_SHARED_STORAGE_AND_SERVICE_STACK", - 159: "CLIENT_ID_PROJECT_SERVICE_STACK_MISSING", - 160: "DIFFERENT_PROJECT_IDS", - 171: "STATS_HISTORY_SEARCH_LIMIT_INVALID", - 192: "STATS_HISTORY_SEARCH_TIME_GROUP_BY_INVALID", - 172: "STATS_HISTORY_SEARCH_ID_FILTER_INVALID", - 173: "STATS_HISTORY_SEARCH_PROJECT_ID_REQUIRED", - 174: "STATS_HISTORY_SEARCH_SUBSCRIPTION_NOT_SUPPORTED", - 193: "STATS_HISTORY_SEARCH_HISTORY_LIMIT_REACHED", - 274: "STATS_HISTORY_SEARCH_RANGE_INVALID", - 278: "STATS_HISTORY_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED", - 276: "STATS_HISTORY_SEARCH_FULL_RANGE_REQUIRED", - 260: "TRANSACTION_DEBIT_SEARCH_LIMIT_INVALID", - 261: "TRANSACTION_DEBIT_SEARCH_TIME_GROUP_BY_INVALID", - 273: "TRANSACTION_DEBIT_SEARCH_RANGE_INVALID", - 262: "TRANSACTION_DEBIT_SEARCH_CLIENT_ID_REQUIRED", - 263: "TRANSACTION_DEBIT_SEARCH_ID_FILTER_INVALID", - 277: "TRANSACTION_DEBIT_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED", - 272: "TRANSACTION_DEBIT_SEARCH_FULL_RANGE_REQUIRED", - 300: "TRANSACTION_DEBIT_SEARCH_TILL_AND_FROM_DATE_TIMEZONES_DIFFER", - 301: "TRANSACTION_DEBIT_SEARCH_UNKNOWN_TIMEZONE", - 271: "TRANSACTION_DEBIT_SEARCH_INVALID_FILTER", - 188: "GITHUB_VERIFICATION_EXPIRED", - 182: "INVALID_GITHUB_TOKEN_ACTION", - 183: "GITHUB_REQUEST_FAILED", - 184: "GITHUB_AUTHORIZATION_REQUIRED", - 185: "GITHUB_EMAIL_ACCESS_REQUIRED", - 186: "GITHUB_NO_VERIFIED_EMAIL_FOUND", - 187: "GITHUB_REPOSITORY_ACCESS_REQUIRED", - 189: "GITHUB_RATE_LIMIT_EXCEEDED", - 206: "SERVICE_STACK_NO_GITHUB_INTEGRATION", - 207: "BRANCH_NAME_REQUIRED", - 268: "TRIGGER_BUILD_REQUIRES_BRANCH_EVENT_TYPE", - 208: "USER_SERVICE_STACK_REQUIRED", - 209: "NO_EXTERNAL_REPOSITORY_INTEGRATION", - 210: "GITHUB_BRANCH_DELETED", - 211: "GITHUB_WEBHOOK_DELETED", - 212: "GITHUB_WEBHOOK_INVALID_PARAMETERS", - 218: "UNEXPECTED_GITHUB_FILE_ENCODING", - 219: "ZEROPS_BUILD_FILE_NOT_FOUND", - 213: "INCORRECT_WEBHOOK_SECRET", - 214: "UNSUPPORTED_WEBHOOK_EVENT_TYPE", - 215: "REPOSITORY_DOES_NOT_MATCH_SERVICE_STACK_SETTINGS", - 216: "PROJECT_STATUS_NOT_IN_NEW_CREATING_ACTIVE", - 217: "GITHUB_PUSH_IGNORED", - 204: "ZEROPS_BUILD_FILE_TOO_LARGE", - 205: "SAME_SERVICE_STACK_TYPE_USED", - 220: "GITHUB_WRONG_REPOSITORY_FULL_NAME_FORMAT", - 221: "GITHUB_WEBHOOKS_LIMIT_EXCEEDED", - 222: "AVATAR_UPLOAD_FORBIDDEN_IMAGE_TYPE", - 223: "AVATAR_UPLOAD_MAX_SIZE", - 224: "AVATAR_UPLOAD_FILE_NOT_FOUND", - 228: "GITLAB_RATE_LIMIT_EXCEEDED", - 229: "GITLAB_VERIFICATION_EXPIRED", - 230: "INVALID_GITLAB_TOKEN_ACTION", - 231: "GITLAB_REQUEST_FAILED", - 232: "GITLAB_AUTHORIZATION_REQUIRED", - 233: "GITLAB_FULL_API_ACCESS_REQUIRED", - 234: "MULTIPLE_INTEGRATIONS_ARE_FORBIDDEN", - 235: "GITLAB_BRANCH_DELETED", - 236: "GITLAB_WEBHOOK_DELETED", - 237: "GITLAB_WEBHOOK_INVALID_PARAMETERS", - 238: "SERVICE_STACK_NO_GITLAB_INTEGRATION", - 239: "GITLAB_PUSH_IGNORED", - 240: "YAML_FIELD_LENGTH_ERROR", - 241: "YAML_WRONG_USE_FIELD_TYPE", - 254: "VAT_NUMBER_NOT_IN_EUCOUNTRY", - 258: "COMPANY_NOT_FOUND_IN_EU", - 244: "VAT_NUMBER_MISSING", - 245: "PAYMENT_IN_PROGRESS", - 250: "DUPLICATE_VAT_NUMBER", - 302: "DUPLICATE_COMPANY_NUMBER", - 303: "CURRENCY_CHANGE", - 266: "ADMIN_USER_ACCOUNT_EXISTS", - 246: "CREDIT_LIMIT_REACHED", - 247: "INSUFFICIENT_CREDIT", - 248: "PROJECT_LOCK_FAILED", - 249: "PROJECT_UPDATE_FAILED", - 267: "MAXIMUM_AMOUNT_EXCEEDED", - 252: "PAYMENT_FAILED_ERROR", - 253: "PAYMENT_NOT_FOUND", - 255: "ADDON_NOT_FOUND", - 259: "INVOICE_NOT_FOUND", - 264: "PRICE_LIST_NOT_FOUND", - 279: "COST_LIMIT_TOO_SMALL", - 289: "PROJECT_IMPORT_INVALID_YAML", - 290: "PROJECT_IMPORT_INVALID_CONFIG_STRUCTURE", - 295: "PROJECT_IMPORT_INVALID_PARAMETER", - 292: "PROJECT_IMPORT_INVALID_TYPE_VERSION", - 293: "PROJECT_IMPORT_MISSING_PARAMETER", - 294: "PROJECT_IMPORT_UNABLE_TO_CREATE_SERVICE_STACK", - 296: "PROJECT_IMPORT_PROJECT_INCLUDED", - 297: "PROJECT_IMPORT_PROJECT_MISSING", - 298: "PROJECT_IMPORT_MISSING_SERVICE", - 309: "INVALID_CUSTOM_AUTOSCALING_VALUE", - 335: "INVALID_CUSTOM_AUTOSCALING_CPU_RAM_RATIO", - 305: "CUSTOM_VERTICAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY", - 307: "CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY", - 308: "CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_IN_NON_HA_MODE", - 311: "ACTION_FORBIDDEN_FOR_THIS_STACK_CATEGORY", - 312: "MODE_UPDATE_FORBIDDEN_FOR_THIS_STACK_CATEGORY", - 304: "YAML_VALIDATION_INVALID_YAML", - 325: "UNEXPECTED_YAML_ENCODING", - 336: "BUCKET_ALREADY_EXISTS", - 337: "S3_API_REQUEST_FAILED", - 161: "USER_ID_WAS_NOT_FOUND", - 162: "AUTHOR_ID_WAS_NOT_FOUND", - 163: "USER_DOES_NOT_HAVE_ACTIVE_CONNECTION_TO_ANY_CLIENT", - 164: "USER_HAS_NOT_ACCESS_TO_ZEROPS", - 195: "INVALID_EMAIL_TOKEN", - 321: "CLIENT_CREATE_FAILED", - 322: "CLIENT_ID_TOO_LONG", - 316: "TRANSFER_ID_TOO_LONG", - 313: "EMAIL_IS_INVALID", - 314: "USER_ACCOUNT_DELETED", - 315: "NO_CONTABO_CLIENT_CONNECTED", - 330: "AMBIGUOUS_USER", - 331: "AMBIGUOUS_USER_SIGN_IN", - 317: "UNSUPPORTED_CURRENCY", - 320: "INVALID_CURRENCY_CODE", - 318: "TRANSFER_PARAM_MISMATCH", - 333: "INVALID_AMOUNT", - } - ErrorCode_value = map[string]int32{ - "NO_ERROR": 0, - "INTERNAL_SERVER_ERROR": 1, - "NOT_FOUND": 326, - "INVALID_USER_INPUT": 2, - "INVALID_USER_INPUT_WITH_TEXT": 3, - "NOT_AUTHORIZED": 4, - "INSUFFICIENT_PRIVILEGES": 5, - "REFRESH_TOKEN_INVALID": 6, - "ENDPOINT_NOT_FOUND": 7, - "POTENTIALLY_FRAUD_BEHAVIOR_DETECTED": 8, - "RE_CAPTCHA_RESPONSE_INVALID": 9, - "DOWNLOAD_TOKEN_INVALID_OR_EXPIRED": 10, - "INCORRECT_USER_CREDENTIALS": 11, - "NO_RIGHTS_TO_SELECTED_ACTION": 12, - "FILE_SIZE_LIMIT_EXCEEDED": 13, - "ADDITIONAL_VERIFICATION_FAILED": 14, - "AT_LEAST_ONE_MANAGER": 191, - "ACTIVE_USER_MUST_BE_CONNECTED_TO_AT_LEAST_ONE_CLIENT": 15, - "INVALID_CREDENTIALS": 16, - "PASSWORD_TOO_SHORT": 270, - "PASSWORD_TOO_LONG": 269, - "NO_ACTIVE_CONNECTION_TO_ANY_CLIENT": 18, - "NO_ACTIVE_CONNECTION_TO_CURRENT_CLIENT": 19, - "TOKEN_EXPIRED": 20, - "CLIENT_NOT_FOUND": 21, - "NO_ACCESS_TO_ZEROPS": 22, - "USER_NOT_FOUND": 23, - "INVALID_DOCUMENT_ROOT": 24, - "INVALID_ENTRYPOINT": 25, - "INVALID_INIT_COMMANDS": 280, - "DOWNLOAD_EXPIRED": 26, - "MULTIPLE_ACCOUNTS_CONNECTED": 334, - "USER_DATA_NOT_FOUND": 27, - "USER_DATA_KEY_INVALID": 28, - "USER_DATA_CONTENT_INVALID": 29, - "USER_DATA_USE_OF_SYSTEM_KEY": 180, - "USER_DATA_DELETE_FORBIDDEN": 30, - "USER_DATA_DUPLICATE_KEY": 31, - "USER_DATA_SYNC_RUNNING": 32, - "USER_DATA_VERSION_MISMATCH": 168, - "USER_TOKEN_NOT_FOUND": 227, - "USER_ACCOUNT_NOT_FOUND": 34, - "TEMPLATE_NOT_FOUND": 35, - "COUNTRY_CALLING_CODE_DOES_NOT_MATCH_PHONE_NUMBER": 36, - "INVALID_PHONE_NUMBER": 37, - "INVALID_USER_ROLE": 38, - "INVALID_CLIENT_USER_GROUP_COMBINATION": 39, - "EMAIL_EXISTS": 40, - "USER_ALREADY_CONNECTED_TO_COMPANY": 41, - "COUNTRY_NOT_FOUND": 42, - "RECORD_NOT_FOUND": 43, - "MAXIMUM_NUMBER_OF_CLIENT_EXCEEDED": 44, - "USER_IS_NOT_IN_BEING_DELETED_STATUS": 45, - "UNABLE_TO_DELETE_YOUR_OWN_ACCOUNT": 46, - "CLIENT_USER_CONNECTION_NOT_FOUND": 47, - "CLIENT_USER_CONNECTION_HAS_BEEN_DELETED": 48, - "BAD_OR_EXPIRED_ACTIVATION_LINK": 49, - "UNABLE_TO_EDIT_DELETED_USER": 50, - "CLIENT_USER_ALREADY_BEEN_DELETED": 51, - "LANGUAGE_NOT_FOUND": 52, - "LANGUAGE_NOT_SUPPORTED": 53, - "DUPLICATED_USER": 54, - "RECORD_IS_READ_ONLY": 55, - "RECORD_IS_DELETED": 56, - "RECORD_COMMON_KEY_EDIT": 57, - "SERVICE_STACK_NOT_FOUND": 61, - "SERVICE_STACK_TYPE_NOT_FOUND": 62, - "SERVICE_STACK_TYPE_VERSION_NOT_FOUND": 63, - "SERVICE_STACK_TYPE_VERSION_IS_NOT_ACTIVE": 64, - "SERVICE_STACK_TYPE_VERSION_REMOVE_DEFAULT": 65, - "SERVICE_STACK_TYPE_INVALID_VERSION": 66, - "SERVICE_STACK_IS_FAILED": 67, - "SERVICE_STACK_IS_SYSTEM_NOT_SUPPORTED": 68, - "SERVICE_STACK_CUSTOM_PORTS_ENABLED_REQUIRED": 69, - "SERVICE_STACK_TYPE_VERSION_NOT_MATCH_WITH_STACK_TYPE": 70, - "SERVICE_STACK_STORAGE_DISK_MAX_LIMIT": 71, - "SERVICE_STACK_STORAGE_DISK_MIN_LIMIT": 72, - "SERVICE_STACK_OBJECT_STORAGE_QUOTA_NOT_FOUND": 73, - "SERVICE_STACK_INIT_COMMANDS_NOT_FOUND": 281, - "SERVICE_STACK_TYPE_OBJECT_STORAGE_REQUIRED": 74, - "SERVICE_STACK_TYPE_OBJECT_STORAGE_FORBIDDEN": 75, - "SERVICE_STACK_TYPE_SHARED_STORAGE_FORBIDDEN": 76, - "SERVICE_STACK_TYPE_STANDARD_FORBIDDEN": 242, - "SERVICE_STACK_IS_READY_TO_DEPLOY": 77, - "SERVICE_STACK_IS_NOT_HTTP": 78, - "SERVICE_STACK_RELOAD_NOT_AVAILABLE": 79, - "SERVICE_STACK_NGINX_CONFIG": 194, - "SERVICE_STACK_SUBDOMAIN_ACCESS_ALREADY_DISABLED": 81, - "SERVICE_STACK_CREATING": 178, - "SERVICE_STACK_UPGRADING": 179, - "SERVICE_STACK_INVALID_CATEGORY": 203, - "SERVICE_STACK_STATUS_NOT_SUPPORTED": 265, - "SERVICE_STACK_USER_NAME_INVALID": 282, - "ACTIVE_SERVICE_STACK_REQUIRED": 283, - "USER_APPLICATION_RUNTIME_SERVICE_STACK_REQUIRED": 284, - "SHARED_STORAGE_NONEMPTY_CONNECTED_STACKS_FORBIDDEN": 329, - "SHARED_STORAGE_SERVICE_STACK_INACTIVE": 328, - "PROCESS_NOT_FOUND": 82, - "PROCESS_IS_ALREADY_OVER": 83, - "PROCESS_IS_ALREADY_RUNNING": 85, - "UNABLE_TO_CREATE_PROCESS": 87, - "CREATE_PROCESS_QUEUED_PROJECT_PROCESS_COUNT_EXCEEDED": 323, - "MANUAL_REPAIR_REQUIRED": 59, - "NOTHING_TO_SYNC": 60, - "IS_NOT_POSSIBLE_TO_EDIT_ANOTHER_USER": 58, - "ACTIVE_SERVICE_STACK_EXISTS_IN_PROJECT": 88, - "INVALID_OLD_PASSWORD": 89, - "PROJECT_STATUS_NOT_SUPPORTED": 90, - "PROJECT_NOT_FOUND": 91, - "PROJECT_IS_NOT_ACTIVE": 167, - "SERVICE_STACK_NAME_UNAVAILABLE": 92, - "SERVICE_STACK_NAME_INVALID": 93, - "CORE_SERVICE_STACK_TYPE_VERSION_NOT_FOUND": 94, - "L7_HTTP_BALANCER_SERVICE_STACK_TYPE_VERSION_NOT_FOUND": 95, - "PROJECT_WILL_BE_DELETED": 96, - "PROJECT_WILL_BE_STARTED": 256, - "PROJECT_WILL_BE_STOPPED": 257, - "STACK_WILL_BE_DELETED": 97, - "STACK_OF_PROJECT_WILL_BE_DELETED": 286, - "STACK_OF_PROJECT_WILL_BE_CREATED": 287, - "USER_DATA_OF_PROJECT_WILL_BE_SYNCED": 288, - "PUBLIC_HTTP_ROUTING_NOT_FOUND": 98, - "PUBLIC_HTTP_ROUTING_AT_LEAST_ONE_DOMAIN_REQUIRED": 99, - "PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME": 100, - "PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK": 101, - "PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME_IN_ANOTHER_ROUTING": 102, - "PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK_IN_ANOTHER_ROUTING": 103, - "PUBLIC_HTTP_ROUTING_DUPLICATE_LOCATION_PATHS": 104, - "PUBLIC_HTTP_ROUTING_ITEMS_LIMIT": 105, - "PUBLIC_HTTP_ROUTING_LOCATIONS_LIMIT": 106, - "PUBLIC_HTTP_ROUTING_DOMAINS_LIMIT": 107, - "PUBLIC_HTTP_ROUTING_INVALID_DOMAIN_NAME_FQDN": 108, - "PUBLIC_HTTP_ROUTING_SSL_FALLBACK": 109, - "PUBLIC_HTTP_ROUTING_LOCATION_DOES_NOT_FOUND": 110, - "PUBLIC_HTTP_ROUTING_INVALID_LOCATIONS_PREFIX": 111, - "PUBLIC_HTTP_ROUTING_MULTIPLE_SERVICE_STACK_ACCESS_POINTS": 112, - "PUBLIC_HTTP_ROUTING_SERVICE_STACK_ACCESS_POINT_NOT_FOUND": 113, - "PUBLIC_HTTP_ROUTING_REQUEST_ONLY_TCP_PORT": 114, - "PUBLIC_HTTP_ROUTING_SERVICE_STACK_DOES_NOT_SUPPORT_HTTP": 115, - "PUBLIC_HTTP_ROUTING_FORBIDDEN_ZEROPS_SUBDOMAIN_SUFFIX": 327, - "NO_PUBLIC_HTTP_ROUTING_IN_L7_HTTP_BALANCING": 116, - "SSL_NOT_SUPPORTED": 117, - "REGISTERED_DOMAIN_HOST_LIMIT_REACHED": 118, - "PUBLIC_SUFFIX_LIST_CONTROL_FAILED": 119, - "PORT_NOT_SUPPORTED": 120, - "PUBLIC_HTTP_ROUTING_SYNC_RUNNING": 121, - "PUBLIC_HTTP_ROUTING_VERSION_MISMATCH": 169, - "PORT_OUT_OF_RANGE": 122, - "PORT_PROTOCOL_INVALID": 123, - "PORT_SCHEME_INVALID": 124, - "UDP_PROTOCOL_SCHEME_MISMATCH": 125, - "PUBLIC_IP_REQUEST_NOT_FOUND": 126, - "PUBLIC_IP_REQUEST_ONLY_ONE": 128, - "PUBLIC_IP_REQUEST_RELEASE_RUNNING": 130, - "USER_NOTIFICATION_NOT_FOUND": 131, - "PUBLIC_PORT_ROUTING_NOT_FOUND": 132, - "PUBLIC_IP_TYPE_NOT_SUPPORTED": 133, - "PORT_AND_PROTOCOL_COMBINATION_NOT_SUPPORTED": 134, - "PUBLIC_PORT_ROUTING_DUPLICATE_RULE": 135, - "INTERNAL_PORT_DUPLICATE_RULE": 181, - "PUBLIC_PORT_ROUTING_SYNC_RUNNING": 136, - "PUBLIC_PORT_ROUTING_INVALID_IP_FORMAT": 137, - "PUBLIC_PORT_ROUTING_FIREWALL_POLICY_CONFLICT": 138, - "PUBLIC_PORT_ROUTING_VERSION_MISMATCH": 170, - "PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_DELETED_RECORD": 139, - "PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_PORTS_ON_SYSTEM_SERVICE": 190, - "DRIVER_NOT_FOUND": 140, - "DRIVER_ENTITY_IS_NOT_SERVICE_STACK": 141, - "DRIVER_ALREADY_SET": 142, - "CLIENT_USER_CONNECTION_ALREADY_EXISTS": 143, - "USER_ALREADY_ASSIGNED": 144, - "SERVICE_STACK_TYPE_USER_STORAGE_REQUIRED": 145, - "APP_VERSION_NOT_FOUND": 146, - "APP_VERSION_INVALID_STATUS": 147, - "DEPLOY_PROCESS_ALREADY_CREATED": 148, - "OBJECT_CONTENT_LENGTH_ZERO": 149, - "OBJECT_MIME_TYPE_NOT_SUPPORTED": 150, - "OBJECT_NOT_FOUND": 151, - "MAX_OBJECT_DISK_SIZE_ESTIMATE_EXCEEDED": 152, - "APP_VERSION_IS_ACTIVE": 226, - "APP_VERSION_NO_ACTIVE_FOUND": 310, - "APP_VERSION_IS_BEING_DEPLOYED": 196, - "APP_VERSION_IS_BEING_BUILT": 197, - "APP_VERSION_IS_NOT_BEING_UPLOADED": 198, - "APP_VERSION_DEPLOYING_FAILED": 199, - "APP_VERSION_BUILDING_FAILED": 200, - "APP_VERSION_YAML_PARSE_FAILED": 225, - "APP_VERSION_YAML_CONFIG_REQUIRED": 324, - "APP_VERSION_DATA_NOT_AVAILABLE": 285, - "APP_VERSION_ACTIVE_HAS_DEFAULT_RUNTIME": 306, - "SHARED_STORAGE_NOT_FOUND": 153, - "SHARED_STORAGE_INVALID_PROJECT": 154, - "SERVICE_STACK_CONNECTION_NOT_FOUND": 155, - "SHARED_STORAGE_INVALID_CATEGORY": 156, - "USER_SERVICE_STACK_INVALID_CATEGORY": 157, - "IDENTICAL_SHARED_STORAGE_AND_SERVICE_STACK": 158, - "CLIENT_ID_PROJECT_SERVICE_STACK_MISSING": 159, - "DIFFERENT_PROJECT_IDS": 160, - "STATS_HISTORY_SEARCH_LIMIT_INVALID": 171, - "STATS_HISTORY_SEARCH_TIME_GROUP_BY_INVALID": 192, - "STATS_HISTORY_SEARCH_ID_FILTER_INVALID": 172, - "STATS_HISTORY_SEARCH_PROJECT_ID_REQUIRED": 173, - "STATS_HISTORY_SEARCH_SUBSCRIPTION_NOT_SUPPORTED": 174, - "STATS_HISTORY_SEARCH_HISTORY_LIMIT_REACHED": 193, - "STATS_HISTORY_SEARCH_RANGE_INVALID": 274, - "STATS_HISTORY_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED": 278, - "STATS_HISTORY_SEARCH_FULL_RANGE_REQUIRED": 276, - "TRANSACTION_DEBIT_SEARCH_LIMIT_INVALID": 260, - "TRANSACTION_DEBIT_SEARCH_TIME_GROUP_BY_INVALID": 261, - "TRANSACTION_DEBIT_SEARCH_RANGE_INVALID": 273, - "TRANSACTION_DEBIT_SEARCH_CLIENT_ID_REQUIRED": 262, - "TRANSACTION_DEBIT_SEARCH_ID_FILTER_INVALID": 263, - "TRANSACTION_DEBIT_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED": 277, - "TRANSACTION_DEBIT_SEARCH_FULL_RANGE_REQUIRED": 272, - "TRANSACTION_DEBIT_SEARCH_TILL_AND_FROM_DATE_TIMEZONES_DIFFER": 300, - "TRANSACTION_DEBIT_SEARCH_UNKNOWN_TIMEZONE": 301, - "TRANSACTION_DEBIT_SEARCH_INVALID_FILTER": 271, - "GITHUB_VERIFICATION_EXPIRED": 188, - "INVALID_GITHUB_TOKEN_ACTION": 182, - "GITHUB_REQUEST_FAILED": 183, - "GITHUB_AUTHORIZATION_REQUIRED": 184, - "GITHUB_EMAIL_ACCESS_REQUIRED": 185, - "GITHUB_NO_VERIFIED_EMAIL_FOUND": 186, - "GITHUB_REPOSITORY_ACCESS_REQUIRED": 187, - "GITHUB_RATE_LIMIT_EXCEEDED": 189, - "SERVICE_STACK_NO_GITHUB_INTEGRATION": 206, - "BRANCH_NAME_REQUIRED": 207, - "TRIGGER_BUILD_REQUIRES_BRANCH_EVENT_TYPE": 268, - "USER_SERVICE_STACK_REQUIRED": 208, - "NO_EXTERNAL_REPOSITORY_INTEGRATION": 209, - "GITHUB_BRANCH_DELETED": 210, - "GITHUB_WEBHOOK_DELETED": 211, - "GITHUB_WEBHOOK_INVALID_PARAMETERS": 212, - "UNEXPECTED_GITHUB_FILE_ENCODING": 218, - "ZEROPS_BUILD_FILE_NOT_FOUND": 219, - "INCORRECT_WEBHOOK_SECRET": 213, - "UNSUPPORTED_WEBHOOK_EVENT_TYPE": 214, - "REPOSITORY_DOES_NOT_MATCH_SERVICE_STACK_SETTINGS": 215, - "PROJECT_STATUS_NOT_IN_NEW_CREATING_ACTIVE": 216, - "GITHUB_PUSH_IGNORED": 217, - "ZEROPS_BUILD_FILE_TOO_LARGE": 204, - "SAME_SERVICE_STACK_TYPE_USED": 205, - "GITHUB_WRONG_REPOSITORY_FULL_NAME_FORMAT": 220, - "GITHUB_WEBHOOKS_LIMIT_EXCEEDED": 221, - "AVATAR_UPLOAD_FORBIDDEN_IMAGE_TYPE": 222, - "AVATAR_UPLOAD_MAX_SIZE": 223, - "AVATAR_UPLOAD_FILE_NOT_FOUND": 224, - "GITLAB_RATE_LIMIT_EXCEEDED": 228, - "GITLAB_VERIFICATION_EXPIRED": 229, - "INVALID_GITLAB_TOKEN_ACTION": 230, - "GITLAB_REQUEST_FAILED": 231, - "GITLAB_AUTHORIZATION_REQUIRED": 232, - "GITLAB_FULL_API_ACCESS_REQUIRED": 233, - "MULTIPLE_INTEGRATIONS_ARE_FORBIDDEN": 234, - "GITLAB_BRANCH_DELETED": 235, - "GITLAB_WEBHOOK_DELETED": 236, - "GITLAB_WEBHOOK_INVALID_PARAMETERS": 237, - "SERVICE_STACK_NO_GITLAB_INTEGRATION": 238, - "GITLAB_PUSH_IGNORED": 239, - "YAML_FIELD_LENGTH_ERROR": 240, - "YAML_WRONG_USE_FIELD_TYPE": 241, - "VAT_NUMBER_NOT_IN_EUCOUNTRY": 254, - "COMPANY_NOT_FOUND_IN_EU": 258, - "VAT_NUMBER_MISSING": 244, - "PAYMENT_IN_PROGRESS": 245, - "DUPLICATE_VAT_NUMBER": 250, - "DUPLICATE_COMPANY_NUMBER": 302, - "CURRENCY_CHANGE": 303, - "ADMIN_USER_ACCOUNT_EXISTS": 266, - "CREDIT_LIMIT_REACHED": 246, - "INSUFFICIENT_CREDIT": 247, - "PROJECT_LOCK_FAILED": 248, - "PROJECT_UPDATE_FAILED": 249, - "MAXIMUM_AMOUNT_EXCEEDED": 267, - "PAYMENT_FAILED_ERROR": 252, - "PAYMENT_NOT_FOUND": 253, - "ADDON_NOT_FOUND": 255, - "INVOICE_NOT_FOUND": 259, - "PRICE_LIST_NOT_FOUND": 264, - "COST_LIMIT_TOO_SMALL": 279, - "PROJECT_IMPORT_INVALID_YAML": 289, - "PROJECT_IMPORT_INVALID_CONFIG_STRUCTURE": 290, - "PROJECT_IMPORT_INVALID_PARAMETER": 295, - "PROJECT_IMPORT_INVALID_TYPE_VERSION": 292, - "PROJECT_IMPORT_MISSING_PARAMETER": 293, - "PROJECT_IMPORT_UNABLE_TO_CREATE_SERVICE_STACK": 294, - "PROJECT_IMPORT_PROJECT_INCLUDED": 296, - "PROJECT_IMPORT_PROJECT_MISSING": 297, - "PROJECT_IMPORT_MISSING_SERVICE": 298, - "INVALID_CUSTOM_AUTOSCALING_VALUE": 309, - "INVALID_CUSTOM_AUTOSCALING_CPU_RAM_RATIO": 335, - "CUSTOM_VERTICAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY": 305, - "CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY": 307, - "CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_IN_NON_HA_MODE": 308, - "ACTION_FORBIDDEN_FOR_THIS_STACK_CATEGORY": 311, - "MODE_UPDATE_FORBIDDEN_FOR_THIS_STACK_CATEGORY": 312, - "YAML_VALIDATION_INVALID_YAML": 304, - "UNEXPECTED_YAML_ENCODING": 325, - "BUCKET_ALREADY_EXISTS": 336, - "S3_API_REQUEST_FAILED": 337, - "USER_ID_WAS_NOT_FOUND": 161, - "AUTHOR_ID_WAS_NOT_FOUND": 162, - "USER_DOES_NOT_HAVE_ACTIVE_CONNECTION_TO_ANY_CLIENT": 163, - "USER_HAS_NOT_ACCESS_TO_ZEROPS": 164, - "INVALID_EMAIL_TOKEN": 195, - "CLIENT_CREATE_FAILED": 321, - "CLIENT_ID_TOO_LONG": 322, - "TRANSFER_ID_TOO_LONG": 316, - "EMAIL_IS_INVALID": 313, - "USER_ACCOUNT_DELETED": 314, - "NO_CONTABO_CLIENT_CONNECTED": 315, - "AMBIGUOUS_USER": 330, - "AMBIGUOUS_USER_SIGN_IN": 331, - "UNSUPPORTED_CURRENCY": 317, - "INVALID_CURRENCY_CODE": 320, - "TRANSFER_PARAM_MISMATCH": 318, - "INVALID_AMOUNT": 333, - } -) - -func (x ErrorCode) Enum() *ErrorCode { - p := new(ErrorCode) - *p = x - return p -} - -func (x ErrorCode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ErrorCode) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[0].Descriptor() -} - -func (ErrorCode) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[0] -} - -func (x ErrorCode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ErrorCode.Descriptor instead. -func (ErrorCode) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{0} -} - -type AppVersionGithubIntegrationEventType int32 - -const ( - AppVersionGithubIntegrationEventType_APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN AppVersionGithubIntegrationEventType = 0 - AppVersionGithubIntegrationEventType_APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_BRANCH AppVersionGithubIntegrationEventType = 1 - AppVersionGithubIntegrationEventType_APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_TAG AppVersionGithubIntegrationEventType = 2 -) - -// Enum value maps for AppVersionGithubIntegrationEventType. -var ( - AppVersionGithubIntegrationEventType_name = map[int32]string{ - 0: "APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN", - 1: "APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_BRANCH", - 2: "APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_TAG", - } - AppVersionGithubIntegrationEventType_value = map[string]int32{ - "APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN": 0, - "APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_BRANCH": 1, - "APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_TAG": 2, - } -) - -func (x AppVersionGithubIntegrationEventType) Enum() *AppVersionGithubIntegrationEventType { - p := new(AppVersionGithubIntegrationEventType) - *p = x - return p -} - -func (x AppVersionGithubIntegrationEventType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (AppVersionGithubIntegrationEventType) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[1].Descriptor() -} - -func (AppVersionGithubIntegrationEventType) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[1] -} - -func (x AppVersionGithubIntegrationEventType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AppVersionGithubIntegrationEventType.Descriptor instead. -func (AppVersionGithubIntegrationEventType) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{1} -} - -type AppVersionGitlabIntegrationEventType int32 - -const ( - AppVersionGitlabIntegrationEventType_APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN AppVersionGitlabIntegrationEventType = 0 - AppVersionGitlabIntegrationEventType_APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_BRANCH AppVersionGitlabIntegrationEventType = 1 - AppVersionGitlabIntegrationEventType_APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_TAG AppVersionGitlabIntegrationEventType = 2 -) - -// Enum value maps for AppVersionGitlabIntegrationEventType. -var ( - AppVersionGitlabIntegrationEventType_name = map[int32]string{ - 0: "APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN", - 1: "APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_BRANCH", - 2: "APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_TAG", - } - AppVersionGitlabIntegrationEventType_value = map[string]int32{ - "APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN": 0, - "APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_BRANCH": 1, - "APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_TAG": 2, - } -) - -func (x AppVersionGitlabIntegrationEventType) Enum() *AppVersionGitlabIntegrationEventType { - p := new(AppVersionGitlabIntegrationEventType) - *p = x - return p -} - -func (x AppVersionGitlabIntegrationEventType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (AppVersionGitlabIntegrationEventType) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[2].Descriptor() -} - -func (AppVersionGitlabIntegrationEventType) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[2] -} - -func (x AppVersionGitlabIntegrationEventType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AppVersionGitlabIntegrationEventType.Descriptor instead. -func (AppVersionGitlabIntegrationEventType) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{2} -} - -type AppVersionSource int32 - -const ( - AppVersionSource_APP_VERSION_SOURCE_UNKNOWN AppVersionSource = 0 - AppVersionSource_APP_VERSION_SOURCE_CLI AppVersionSource = 1 - AppVersionSource_APP_VERSION_SOURCE_GUI AppVersionSource = 2 - AppVersionSource_APP_VERSION_SOURCE_GITHUB AppVersionSource = 3 - AppVersionSource_APP_VERSION_SOURCE_GITLAB AppVersionSource = 4 - AppVersionSource_APP_VERSION_SOURCE_GIT AppVersionSource = 5 -) - -// Enum value maps for AppVersionSource. -var ( - AppVersionSource_name = map[int32]string{ - 0: "APP_VERSION_SOURCE_UNKNOWN", - 1: "APP_VERSION_SOURCE_CLI", - 2: "APP_VERSION_SOURCE_GUI", - 3: "APP_VERSION_SOURCE_GITHUB", - 4: "APP_VERSION_SOURCE_GITLAB", - 5: "APP_VERSION_SOURCE_GIT", - } - AppVersionSource_value = map[string]int32{ - "APP_VERSION_SOURCE_UNKNOWN": 0, - "APP_VERSION_SOURCE_CLI": 1, - "APP_VERSION_SOURCE_GUI": 2, - "APP_VERSION_SOURCE_GITHUB": 3, - "APP_VERSION_SOURCE_GITLAB": 4, - "APP_VERSION_SOURCE_GIT": 5, - } -) - -func (x AppVersionSource) Enum() *AppVersionSource { - p := new(AppVersionSource) - *p = x - return p -} - -func (x AppVersionSource) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (AppVersionSource) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[3].Descriptor() -} - -func (AppVersionSource) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[3] -} - -func (x AppVersionSource) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AppVersionSource.Descriptor instead. -func (AppVersionSource) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{3} -} - -type AppVersionStatus int32 - -const ( - AppVersionStatus_APP_VERSION_STATUS_UNKNOWN AppVersionStatus = 0 - AppVersionStatus_APP_VERSION_STATUS_UPLOADING AppVersionStatus = 1 - AppVersionStatus_APP_VERSION_STATUS_WAITING_TO_DEPLOY AppVersionStatus = 2 - AppVersionStatus_APP_VERSION_STATUS_DEPLOYING AppVersionStatus = 3 - AppVersionStatus_APP_VERSION_STATUS_DEPLOY_FAILED AppVersionStatus = 4 - AppVersionStatus_APP_VERSION_STATUS_ACTIVE AppVersionStatus = 5 - AppVersionStatus_APP_VERSION_STATUS_BACKUP AppVersionStatus = 6 - AppVersionStatus_APP_VERSION_STATUS_BUILDING AppVersionStatus = 7 - AppVersionStatus_APP_VERSION_STATUS_WAITING_TO_BUILD AppVersionStatus = 8 - AppVersionStatus_APP_VERSION_STATUS_BUILD_FAILED AppVersionStatus = 9 - AppVersionStatus_APP_VERSION_STATUS_PREPARING_RUNTIME AppVersionStatus = 10 - AppVersionStatus_APP_VERSION_STATUS_PREPARING_RUNTIME_FAILED AppVersionStatus = 11 - AppVersionStatus_APP_VERSION_STATUS_BUILD_VALIDATION_FAILED AppVersionStatus = 12 -) - -// Enum value maps for AppVersionStatus. -var ( - AppVersionStatus_name = map[int32]string{ - 0: "APP_VERSION_STATUS_UNKNOWN", - 1: "APP_VERSION_STATUS_UPLOADING", - 2: "APP_VERSION_STATUS_WAITING_TO_DEPLOY", - 3: "APP_VERSION_STATUS_DEPLOYING", - 4: "APP_VERSION_STATUS_DEPLOY_FAILED", - 5: "APP_VERSION_STATUS_ACTIVE", - 6: "APP_VERSION_STATUS_BACKUP", - 7: "APP_VERSION_STATUS_BUILDING", - 8: "APP_VERSION_STATUS_WAITING_TO_BUILD", - 9: "APP_VERSION_STATUS_BUILD_FAILED", - 10: "APP_VERSION_STATUS_PREPARING_RUNTIME", - 11: "APP_VERSION_STATUS_PREPARING_RUNTIME_FAILED", - 12: "APP_VERSION_STATUS_BUILD_VALIDATION_FAILED", - } - AppVersionStatus_value = map[string]int32{ - "APP_VERSION_STATUS_UNKNOWN": 0, - "APP_VERSION_STATUS_UPLOADING": 1, - "APP_VERSION_STATUS_WAITING_TO_DEPLOY": 2, - "APP_VERSION_STATUS_DEPLOYING": 3, - "APP_VERSION_STATUS_DEPLOY_FAILED": 4, - "APP_VERSION_STATUS_ACTIVE": 5, - "APP_VERSION_STATUS_BACKUP": 6, - "APP_VERSION_STATUS_BUILDING": 7, - "APP_VERSION_STATUS_WAITING_TO_BUILD": 8, - "APP_VERSION_STATUS_BUILD_FAILED": 9, - "APP_VERSION_STATUS_PREPARING_RUNTIME": 10, - "APP_VERSION_STATUS_PREPARING_RUNTIME_FAILED": 11, - "APP_VERSION_STATUS_BUILD_VALIDATION_FAILED": 12, - } -) - -func (x AppVersionStatus) Enum() *AppVersionStatus { - p := new(AppVersionStatus) - *p = x - return p -} - -func (x AppVersionStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (AppVersionStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[4].Descriptor() -} - -func (AppVersionStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[4] -} - -func (x AppVersionStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AppVersionStatus.Descriptor instead. -func (AppVersionStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{4} -} - -type ClientUserLightRoleCode int32 - -const ( - ClientUserLightRoleCode_CLIENT_USER_LIGHT_ROLE_CODE_UNKNOWN ClientUserLightRoleCode = 0 - ClientUserLightRoleCode_CLIENT_USER_LIGHT_ROLE_CODE_MANAGER ClientUserLightRoleCode = 1 -) - -// Enum value maps for ClientUserLightRoleCode. -var ( - ClientUserLightRoleCode_name = map[int32]string{ - 0: "CLIENT_USER_LIGHT_ROLE_CODE_UNKNOWN", - 1: "CLIENT_USER_LIGHT_ROLE_CODE_MANAGER", - } - ClientUserLightRoleCode_value = map[string]int32{ - "CLIENT_USER_LIGHT_ROLE_CODE_UNKNOWN": 0, - "CLIENT_USER_LIGHT_ROLE_CODE_MANAGER": 1, - } -) - -func (x ClientUserLightRoleCode) Enum() *ClientUserLightRoleCode { - p := new(ClientUserLightRoleCode) - *p = x - return p -} - -func (x ClientUserLightRoleCode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ClientUserLightRoleCode) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[5].Descriptor() -} - -func (ClientUserLightRoleCode) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[5] -} - -func (x ClientUserLightRoleCode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ClientUserLightRoleCode.Descriptor instead. -func (ClientUserLightRoleCode) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{5} -} - -type ClientUserLightStatus int32 - -const ( - ClientUserLightStatus_CLIENT_USER_LIGHT_STATUS_UNKNOWN ClientUserLightStatus = 0 - ClientUserLightStatus_CLIENT_USER_LIGHT_STATUS_ACTIVE ClientUserLightStatus = 1 - ClientUserLightStatus_CLIENT_USER_LIGHT_STATUS_WAITING_AUTHORIZATION ClientUserLightStatus = 2 - ClientUserLightStatus_CLIENT_USER_LIGHT_STATUS_BEING_DELETED ClientUserLightStatus = 3 -) - -// Enum value maps for ClientUserLightStatus. -var ( - ClientUserLightStatus_name = map[int32]string{ - 0: "CLIENT_USER_LIGHT_STATUS_UNKNOWN", - 1: "CLIENT_USER_LIGHT_STATUS_ACTIVE", - 2: "CLIENT_USER_LIGHT_STATUS_WAITING_AUTHORIZATION", - 3: "CLIENT_USER_LIGHT_STATUS_BEING_DELETED", - } - ClientUserLightStatus_value = map[string]int32{ - "CLIENT_USER_LIGHT_STATUS_UNKNOWN": 0, - "CLIENT_USER_LIGHT_STATUS_ACTIVE": 1, - "CLIENT_USER_LIGHT_STATUS_WAITING_AUTHORIZATION": 2, - "CLIENT_USER_LIGHT_STATUS_BEING_DELETED": 3, - } -) - -func (x ClientUserLightStatus) Enum() *ClientUserLightStatus { - p := new(ClientUserLightStatus) - *p = x - return p -} - -func (x ClientUserLightStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ClientUserLightStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[6].Descriptor() -} - -func (ClientUserLightStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[6] -} - -func (x ClientUserLightStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ClientUserLightStatus.Descriptor instead. -func (ClientUserLightStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{6} -} - -type GithubIntegrationEventType int32 - -const ( - GithubIntegrationEventType_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN GithubIntegrationEventType = 0 - GithubIntegrationEventType_GITHUB_INTEGRATION_EVENT_TYPE_BRANCH GithubIntegrationEventType = 1 - GithubIntegrationEventType_GITHUB_INTEGRATION_EVENT_TYPE_TAG GithubIntegrationEventType = 2 -) - -// Enum value maps for GithubIntegrationEventType. -var ( - GithubIntegrationEventType_name = map[int32]string{ - 0: "GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN", - 1: "GITHUB_INTEGRATION_EVENT_TYPE_BRANCH", - 2: "GITHUB_INTEGRATION_EVENT_TYPE_TAG", - } - GithubIntegrationEventType_value = map[string]int32{ - "GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN": 0, - "GITHUB_INTEGRATION_EVENT_TYPE_BRANCH": 1, - "GITHUB_INTEGRATION_EVENT_TYPE_TAG": 2, - } -) - -func (x GithubIntegrationEventType) Enum() *GithubIntegrationEventType { - p := new(GithubIntegrationEventType) - *p = x - return p -} - -func (x GithubIntegrationEventType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (GithubIntegrationEventType) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[7].Descriptor() -} - -func (GithubIntegrationEventType) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[7] -} - -func (x GithubIntegrationEventType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use GithubIntegrationEventType.Descriptor instead. -func (GithubIntegrationEventType) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{7} -} - -type GitlabIntegrationEventType int32 - -const ( - GitlabIntegrationEventType_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN GitlabIntegrationEventType = 0 - GitlabIntegrationEventType_GITLAB_INTEGRATION_EVENT_TYPE_BRANCH GitlabIntegrationEventType = 1 - GitlabIntegrationEventType_GITLAB_INTEGRATION_EVENT_TYPE_TAG GitlabIntegrationEventType = 2 -) - -// Enum value maps for GitlabIntegrationEventType. -var ( - GitlabIntegrationEventType_name = map[int32]string{ - 0: "GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN", - 1: "GITLAB_INTEGRATION_EVENT_TYPE_BRANCH", - 2: "GITLAB_INTEGRATION_EVENT_TYPE_TAG", - } - GitlabIntegrationEventType_value = map[string]int32{ - "GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN": 0, - "GITLAB_INTEGRATION_EVENT_TYPE_BRANCH": 1, - "GITLAB_INTEGRATION_EVENT_TYPE_TAG": 2, - } -) - -func (x GitlabIntegrationEventType) Enum() *GitlabIntegrationEventType { - p := new(GitlabIntegrationEventType) - *p = x - return p -} - -func (x GitlabIntegrationEventType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (GitlabIntegrationEventType) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[8].Descriptor() -} - -func (GitlabIntegrationEventType) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[8] -} - -func (x GitlabIntegrationEventType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use GitlabIntegrationEventType.Descriptor instead. -func (GitlabIntegrationEventType) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{8} -} - -type ProcessStatus int32 - -const ( - ProcessStatus_PROCESS_STATUS_UNKNOWN ProcessStatus = 0 - ProcessStatus_PROCESS_STATUS_PENDING ProcessStatus = 1 - ProcessStatus_PROCESS_STATUS_RUNNING ProcessStatus = 2 - ProcessStatus_PROCESS_STATUS_ROLLBACKING ProcessStatus = 3 - ProcessStatus_PROCESS_STATUS_CANCELING ProcessStatus = 4 - ProcessStatus_PROCESS_STATUS_FINISHED ProcessStatus = 5 - ProcessStatus_PROCESS_STATUS_FAILED ProcessStatus = 6 - ProcessStatus_PROCESS_STATUS_CANCELED ProcessStatus = 7 -) - -// Enum value maps for ProcessStatus. -var ( - ProcessStatus_name = map[int32]string{ - 0: "PROCESS_STATUS_UNKNOWN", - 1: "PROCESS_STATUS_PENDING", - 2: "PROCESS_STATUS_RUNNING", - 3: "PROCESS_STATUS_ROLLBACKING", - 4: "PROCESS_STATUS_CANCELING", - 5: "PROCESS_STATUS_FINISHED", - 6: "PROCESS_STATUS_FAILED", - 7: "PROCESS_STATUS_CANCELED", - } - ProcessStatus_value = map[string]int32{ - "PROCESS_STATUS_UNKNOWN": 0, - "PROCESS_STATUS_PENDING": 1, - "PROCESS_STATUS_RUNNING": 2, - "PROCESS_STATUS_ROLLBACKING": 3, - "PROCESS_STATUS_CANCELING": 4, - "PROCESS_STATUS_FINISHED": 5, - "PROCESS_STATUS_FAILED": 6, - "PROCESS_STATUS_CANCELED": 7, - } -) - -func (x ProcessStatus) Enum() *ProcessStatus { - p := new(ProcessStatus) - *p = x - return p -} - -func (x ProcessStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ProcessStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[9].Descriptor() -} - -func (ProcessStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[9] -} - -func (x ProcessStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ProcessStatus.Descriptor instead. -func (ProcessStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{9} -} - -type ProjectStatus int32 - -const ( - ProjectStatus_PROJECT_STATUS_UNKNOWN ProjectStatus = 0 - ProjectStatus_PROJECT_STATUS_NEW ProjectStatus = 1 - ProjectStatus_PROJECT_STATUS_CREATING ProjectStatus = 2 - ProjectStatus_PROJECT_STATUS_ACTIVE ProjectStatus = 3 - ProjectStatus_PROJECT_STATUS_DELETING ProjectStatus = 4 - ProjectStatus_PROJECT_STATUS_FAILED ProjectStatus = 5 - ProjectStatus_PROJECT_STATUS_STOPPING ProjectStatus = 6 - ProjectStatus_PROJECT_STATUS_STOPPED ProjectStatus = 7 - ProjectStatus_PROJECT_STATUS_STARTING ProjectStatus = 8 -) - -// Enum value maps for ProjectStatus. -var ( - ProjectStatus_name = map[int32]string{ - 0: "PROJECT_STATUS_UNKNOWN", - 1: "PROJECT_STATUS_NEW", - 2: "PROJECT_STATUS_CREATING", - 3: "PROJECT_STATUS_ACTIVE", - 4: "PROJECT_STATUS_DELETING", - 5: "PROJECT_STATUS_FAILED", - 6: "PROJECT_STATUS_STOPPING", - 7: "PROJECT_STATUS_STOPPED", - 8: "PROJECT_STATUS_STARTING", - } - ProjectStatus_value = map[string]int32{ - "PROJECT_STATUS_UNKNOWN": 0, - "PROJECT_STATUS_NEW": 1, - "PROJECT_STATUS_CREATING": 2, - "PROJECT_STATUS_ACTIVE": 3, - "PROJECT_STATUS_DELETING": 4, - "PROJECT_STATUS_FAILED": 5, - "PROJECT_STATUS_STOPPING": 6, - "PROJECT_STATUS_STOPPED": 7, - "PROJECT_STATUS_STARTING": 8, - } -) - -func (x ProjectStatus) Enum() *ProjectStatus { - p := new(ProjectStatus) - *p = x - return p -} - -func (x ProjectStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ProjectStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[10].Descriptor() -} - -func (ProjectStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[10] -} - -func (x ProjectStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ProjectStatus.Descriptor instead. -func (ProjectStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{10} -} - -type PublicHttpRoutingDomainDnsCheckStatus int32 - -const ( - PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_UNKNOWN PublicHttpRoutingDomainDnsCheckStatus = 0 - PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_PENDING PublicHttpRoutingDomainDnsCheckStatus = 1 - PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_CHECKING PublicHttpRoutingDomainDnsCheckStatus = 2 - PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_OK PublicHttpRoutingDomainDnsCheckStatus = 3 - PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_FAILED PublicHttpRoutingDomainDnsCheckStatus = 4 - PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_IGNORED PublicHttpRoutingDomainDnsCheckStatus = 5 -) - -// Enum value maps for PublicHttpRoutingDomainDnsCheckStatus. -var ( - PublicHttpRoutingDomainDnsCheckStatus_name = map[int32]string{ - 0: "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_UNKNOWN", - 1: "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_PENDING", - 2: "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_CHECKING", - 3: "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_OK", - 4: "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_FAILED", - 5: "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_IGNORED", - } - PublicHttpRoutingDomainDnsCheckStatus_value = map[string]int32{ - "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_UNKNOWN": 0, - "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_PENDING": 1, - "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_CHECKING": 2, - "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_OK": 3, - "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_FAILED": 4, - "PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_IGNORED": 5, - } -) - -func (x PublicHttpRoutingDomainDnsCheckStatus) Enum() *PublicHttpRoutingDomainDnsCheckStatus { - p := new(PublicHttpRoutingDomainDnsCheckStatus) - *p = x - return p -} - -func (x PublicHttpRoutingDomainDnsCheckStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (PublicHttpRoutingDomainDnsCheckStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[11].Descriptor() -} - -func (PublicHttpRoutingDomainDnsCheckStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[11] -} - -func (x PublicHttpRoutingDomainDnsCheckStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use PublicHttpRoutingDomainDnsCheckStatus.Descriptor instead. -func (PublicHttpRoutingDomainDnsCheckStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{11} -} - -type PublicHttpRoutingDomainSslStatus int32 - -const ( - PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_UNKNOWN PublicHttpRoutingDomainSslStatus = 0 - PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INACTIVE PublicHttpRoutingDomainSslStatus = 1 - PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_BEING_INSTALLED PublicHttpRoutingDomainSslStatus = 2 - PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_WAITING_FOR_DNS PublicHttpRoutingDomainSslStatus = 3 - PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_ACTIVE PublicHttpRoutingDomainSslStatus = 4 - PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INSTALLATION_FAILED PublicHttpRoutingDomainSslStatus = 5 -) - -// Enum value maps for PublicHttpRoutingDomainSslStatus. -var ( - PublicHttpRoutingDomainSslStatus_name = map[int32]string{ - 0: "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_UNKNOWN", - 1: "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INACTIVE", - 2: "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_BEING_INSTALLED", - 3: "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_WAITING_FOR_DNS", - 4: "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_ACTIVE", - 5: "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INSTALLATION_FAILED", - } - PublicHttpRoutingDomainSslStatus_value = map[string]int32{ - "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_UNKNOWN": 0, - "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INACTIVE": 1, - "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_BEING_INSTALLED": 2, - "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_WAITING_FOR_DNS": 3, - "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_ACTIVE": 4, - "PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INSTALLATION_FAILED": 5, - } -) - -func (x PublicHttpRoutingDomainSslStatus) Enum() *PublicHttpRoutingDomainSslStatus { - p := new(PublicHttpRoutingDomainSslStatus) - *p = x - return p -} - -func (x PublicHttpRoutingDomainSslStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (PublicHttpRoutingDomainSslStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[12].Descriptor() -} - -func (PublicHttpRoutingDomainSslStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[12] -} - -func (x PublicHttpRoutingDomainSslStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use PublicHttpRoutingDomainSslStatus.Descriptor instead. -func (PublicHttpRoutingDomainSslStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{12} -} - -type ServicePortProtocol int32 - -const ( - ServicePortProtocol_SERVICE_PORT_PROTOCOL_UNKNOWN ServicePortProtocol = 0 - ServicePortProtocol_SERVICE_PORT_PROTOCOL_tcp ServicePortProtocol = 1 - ServicePortProtocol_SERVICE_PORT_PROTOCOL_udp ServicePortProtocol = 2 -) - -// Enum value maps for ServicePortProtocol. -var ( - ServicePortProtocol_name = map[int32]string{ - 0: "SERVICE_PORT_PROTOCOL_UNKNOWN", - 1: "SERVICE_PORT_PROTOCOL_tcp", - 2: "SERVICE_PORT_PROTOCOL_udp", - } - ServicePortProtocol_value = map[string]int32{ - "SERVICE_PORT_PROTOCOL_UNKNOWN": 0, - "SERVICE_PORT_PROTOCOL_tcp": 1, - "SERVICE_PORT_PROTOCOL_udp": 2, - } -) - -func (x ServicePortProtocol) Enum() *ServicePortProtocol { - p := new(ServicePortProtocol) - *p = x - return p -} - -func (x ServicePortProtocol) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ServicePortProtocol) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[13].Descriptor() -} - -func (ServicePortProtocol) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[13] -} - -func (x ServicePortProtocol) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ServicePortProtocol.Descriptor instead. -func (ServicePortProtocol) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{13} -} - -type ServicePortScheme int32 - -const ( - ServicePortScheme_SERVICE_PORT_SCHEME_UNKNOWN ServicePortScheme = 0 - ServicePortScheme_SERVICE_PORT_SCHEME_tcp ServicePortScheme = 1 - ServicePortScheme_SERVICE_PORT_SCHEME_udp ServicePortScheme = 2 - ServicePortScheme_SERVICE_PORT_SCHEME_http ServicePortScheme = 3 - ServicePortScheme_SERVICE_PORT_SCHEME_https ServicePortScheme = 4 - ServicePortScheme_SERVICE_PORT_SCHEME_redis ServicePortScheme = 5 - ServicePortScheme_SERVICE_PORT_SCHEME_mysql ServicePortScheme = 7 - ServicePortScheme_SERVICE_PORT_SCHEME_udpinflux ServicePortScheme = 8 - ServicePortScheme_SERVICE_PORT_SCHEME_mongodb ServicePortScheme = 9 - ServicePortScheme_SERVICE_PORT_SCHEME_postgresql ServicePortScheme = 10 - ServicePortScheme_SERVICE_PORT_SCHEME_amqp ServicePortScheme = 11 - ServicePortScheme_SERVICE_PORT_SCHEME_stomp ServicePortScheme = 12 - ServicePortScheme_SERVICE_PORT_SCHEME_mqtt ServicePortScheme = 13 -) - -// Enum value maps for ServicePortScheme. -var ( - ServicePortScheme_name = map[int32]string{ - 0: "SERVICE_PORT_SCHEME_UNKNOWN", - 1: "SERVICE_PORT_SCHEME_tcp", - 2: "SERVICE_PORT_SCHEME_udp", - 3: "SERVICE_PORT_SCHEME_http", - 4: "SERVICE_PORT_SCHEME_https", - 5: "SERVICE_PORT_SCHEME_redis", - 7: "SERVICE_PORT_SCHEME_mysql", - 8: "SERVICE_PORT_SCHEME_udpinflux", - 9: "SERVICE_PORT_SCHEME_mongodb", - 10: "SERVICE_PORT_SCHEME_postgresql", - 11: "SERVICE_PORT_SCHEME_amqp", - 12: "SERVICE_PORT_SCHEME_stomp", - 13: "SERVICE_PORT_SCHEME_mqtt", - } - ServicePortScheme_value = map[string]int32{ - "SERVICE_PORT_SCHEME_UNKNOWN": 0, - "SERVICE_PORT_SCHEME_tcp": 1, - "SERVICE_PORT_SCHEME_udp": 2, - "SERVICE_PORT_SCHEME_http": 3, - "SERVICE_PORT_SCHEME_https": 4, - "SERVICE_PORT_SCHEME_redis": 5, - "SERVICE_PORT_SCHEME_mysql": 7, - "SERVICE_PORT_SCHEME_udpinflux": 8, - "SERVICE_PORT_SCHEME_mongodb": 9, - "SERVICE_PORT_SCHEME_postgresql": 10, - "SERVICE_PORT_SCHEME_amqp": 11, - "SERVICE_PORT_SCHEME_stomp": 12, - "SERVICE_PORT_SCHEME_mqtt": 13, - } -) - -func (x ServicePortScheme) Enum() *ServicePortScheme { - p := new(ServicePortScheme) - *p = x - return p -} - -func (x ServicePortScheme) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ServicePortScheme) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[14].Descriptor() -} - -func (ServicePortScheme) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[14] -} - -func (x ServicePortScheme) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ServicePortScheme.Descriptor instead. -func (ServicePortScheme) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{14} -} - -type ServiceStackConnectionStatus int32 - -const ( - ServiceStackConnectionStatus_SERVICE_STACK_CONNECTION_STATUS_UNKNOWN ServiceStackConnectionStatus = 0 - ServiceStackConnectionStatus_SERVICE_STACK_CONNECTION_STATUS_CREATING ServiceStackConnectionStatus = 1 - ServiceStackConnectionStatus_SERVICE_STACK_CONNECTION_STATUS_ACTIVE ServiceStackConnectionStatus = 2 - ServiceStackConnectionStatus_SERVICE_STACK_CONNECTION_STATUS_DELETING ServiceStackConnectionStatus = 3 -) - -// Enum value maps for ServiceStackConnectionStatus. -var ( - ServiceStackConnectionStatus_name = map[int32]string{ - 0: "SERVICE_STACK_CONNECTION_STATUS_UNKNOWN", - 1: "SERVICE_STACK_CONNECTION_STATUS_CREATING", - 2: "SERVICE_STACK_CONNECTION_STATUS_ACTIVE", - 3: "SERVICE_STACK_CONNECTION_STATUS_DELETING", - } - ServiceStackConnectionStatus_value = map[string]int32{ - "SERVICE_STACK_CONNECTION_STATUS_UNKNOWN": 0, - "SERVICE_STACK_CONNECTION_STATUS_CREATING": 1, - "SERVICE_STACK_CONNECTION_STATUS_ACTIVE": 2, - "SERVICE_STACK_CONNECTION_STATUS_DELETING": 3, - } -) - -func (x ServiceStackConnectionStatus) Enum() *ServiceStackConnectionStatus { - p := new(ServiceStackConnectionStatus) - *p = x - return p -} - -func (x ServiceStackConnectionStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ServiceStackConnectionStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[15].Descriptor() -} - -func (ServiceStackConnectionStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[15] -} - -func (x ServiceStackConnectionStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ServiceStackConnectionStatus.Descriptor instead. -func (ServiceStackConnectionStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{15} -} - -type ServiceStackMode int32 - -const ( - ServiceStackMode_SERVICE_STACK_MODE_UNKNOWN ServiceStackMode = 0 - ServiceStackMode_SERVICE_STACK_MODE_HA ServiceStackMode = 1 - ServiceStackMode_SERVICE_STACK_MODE_NON_HA ServiceStackMode = 2 -) - -// Enum value maps for ServiceStackMode. -var ( - ServiceStackMode_name = map[int32]string{ - 0: "SERVICE_STACK_MODE_UNKNOWN", - 1: "SERVICE_STACK_MODE_HA", - 2: "SERVICE_STACK_MODE_NON_HA", - } - ServiceStackMode_value = map[string]int32{ - "SERVICE_STACK_MODE_UNKNOWN": 0, - "SERVICE_STACK_MODE_HA": 1, - "SERVICE_STACK_MODE_NON_HA": 2, - } -) - -func (x ServiceStackMode) Enum() *ServiceStackMode { - p := new(ServiceStackMode) - *p = x - return p -} - -func (x ServiceStackMode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ServiceStackMode) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[16].Descriptor() -} - -func (ServiceStackMode) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[16] -} - -func (x ServiceStackMode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ServiceStackMode.Descriptor instead. -func (ServiceStackMode) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{16} -} - -type ServiceStackStatus int32 - -const ( - ServiceStackStatus_SERVICE_STACK_STATUS_UNKNOWN ServiceStackStatus = 0 - ServiceStackStatus_SERVICE_STACK_STATUS_NEW ServiceStackStatus = 1 - ServiceStackStatus_SERVICE_STACK_STATUS_CREATING ServiceStackStatus = 2 - ServiceStackStatus_SERVICE_STACK_STATUS_ACTIVE ServiceStackStatus = 3 - ServiceStackStatus_SERVICE_STACK_STATUS_STOPPING ServiceStackStatus = 4 - ServiceStackStatus_SERVICE_STACK_STATUS_STOPPED ServiceStackStatus = 5 - ServiceStackStatus_SERVICE_STACK_STATUS_STARTING ServiceStackStatus = 6 - ServiceStackStatus_SERVICE_STACK_STATUS_RESTARTING ServiceStackStatus = 7 - ServiceStackStatus_SERVICE_STACK_STATUS_RELOADING ServiceStackStatus = 8 - ServiceStackStatus_SERVICE_STACK_STATUS_DELETING ServiceStackStatus = 9 - ServiceStackStatus_SERVICE_STACK_STATUS_DELETED ServiceStackStatus = 10 - ServiceStackStatus_SERVICE_STACK_STATUS_FAILED ServiceStackStatus = 11 - ServiceStackStatus_SERVICE_STACK_STATUS_ACTION_FAILED ServiceStackStatus = 29 - ServiceStackStatus_SERVICE_STACK_STATUS_UPGRADING ServiceStackStatus = 13 - ServiceStackStatus_SERVICE_STACK_STATUS_READY_TO_DEPLOY ServiceStackStatus = 14 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_CREATING ServiceStackStatus = 18 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_ACTIVE ServiceStackStatus = 35 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_STOPPING ServiceStackStatus = 21 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_STOPPED ServiceStackStatus = 22 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_STARTING ServiceStackStatus = 23 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_RESTARTING ServiceStackStatus = 24 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_RELOADING ServiceStackStatus = 25 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_DELETING ServiceStackStatus = 15 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_DELETED ServiceStackStatus = 36 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_FAILED ServiceStackStatus = 16 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_ACTION_FAILED ServiceStackStatus = 28 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_REPAIRING ServiceStackStatus = 17 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_CONTAINER_FAILED ServiceStackStatus = 19 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_MOVING_CONTAINER ServiceStackStatus = 20 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_UPGRADING ServiceStackStatus = 26 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_SCALING ServiceStackStatus = 37 - ServiceStackStatus_SERVICE_STACK_STATUS_SERVICE_REPAIR_FAILED ServiceStackStatus = 38 - ServiceStackStatus_SERVICE_STACK_STATUS_REPAIRING ServiceStackStatus = 30 - ServiceStackStatus_SERVICE_STACK_STATUS_CONTAINER_FAILED ServiceStackStatus = 31 - ServiceStackStatus_SERVICE_STACK_STATUS_MOVING_CONTAINER ServiceStackStatus = 32 - ServiceStackStatus_SERVICE_STACK_STATUS_SCALING ServiceStackStatus = 33 - ServiceStackStatus_SERVICE_STACK_STATUS_REPAIR_FAILED ServiceStackStatus = 34 -) - -// Enum value maps for ServiceStackStatus. -var ( - ServiceStackStatus_name = map[int32]string{ - 0: "SERVICE_STACK_STATUS_UNKNOWN", - 1: "SERVICE_STACK_STATUS_NEW", - 2: "SERVICE_STACK_STATUS_CREATING", - 3: "SERVICE_STACK_STATUS_ACTIVE", - 4: "SERVICE_STACK_STATUS_STOPPING", - 5: "SERVICE_STACK_STATUS_STOPPED", - 6: "SERVICE_STACK_STATUS_STARTING", - 7: "SERVICE_STACK_STATUS_RESTARTING", - 8: "SERVICE_STACK_STATUS_RELOADING", - 9: "SERVICE_STACK_STATUS_DELETING", - 10: "SERVICE_STACK_STATUS_DELETED", - 11: "SERVICE_STACK_STATUS_FAILED", - 29: "SERVICE_STACK_STATUS_ACTION_FAILED", - 13: "SERVICE_STACK_STATUS_UPGRADING", - 14: "SERVICE_STACK_STATUS_READY_TO_DEPLOY", - 18: "SERVICE_STACK_STATUS_SERVICE_CREATING", - 35: "SERVICE_STACK_STATUS_SERVICE_ACTIVE", - 21: "SERVICE_STACK_STATUS_SERVICE_STOPPING", - 22: "SERVICE_STACK_STATUS_SERVICE_STOPPED", - 23: "SERVICE_STACK_STATUS_SERVICE_STARTING", - 24: "SERVICE_STACK_STATUS_SERVICE_RESTARTING", - 25: "SERVICE_STACK_STATUS_SERVICE_RELOADING", - 15: "SERVICE_STACK_STATUS_SERVICE_DELETING", - 36: "SERVICE_STACK_STATUS_SERVICE_DELETED", - 16: "SERVICE_STACK_STATUS_SERVICE_FAILED", - 28: "SERVICE_STACK_STATUS_SERVICE_ACTION_FAILED", - 17: "SERVICE_STACK_STATUS_SERVICE_REPAIRING", - 19: "SERVICE_STACK_STATUS_SERVICE_CONTAINER_FAILED", - 20: "SERVICE_STACK_STATUS_SERVICE_MOVING_CONTAINER", - 26: "SERVICE_STACK_STATUS_SERVICE_UPGRADING", - 37: "SERVICE_STACK_STATUS_SERVICE_SCALING", - 38: "SERVICE_STACK_STATUS_SERVICE_REPAIR_FAILED", - 30: "SERVICE_STACK_STATUS_REPAIRING", - 31: "SERVICE_STACK_STATUS_CONTAINER_FAILED", - 32: "SERVICE_STACK_STATUS_MOVING_CONTAINER", - 33: "SERVICE_STACK_STATUS_SCALING", - 34: "SERVICE_STACK_STATUS_REPAIR_FAILED", - } - ServiceStackStatus_value = map[string]int32{ - "SERVICE_STACK_STATUS_UNKNOWN": 0, - "SERVICE_STACK_STATUS_NEW": 1, - "SERVICE_STACK_STATUS_CREATING": 2, - "SERVICE_STACK_STATUS_ACTIVE": 3, - "SERVICE_STACK_STATUS_STOPPING": 4, - "SERVICE_STACK_STATUS_STOPPED": 5, - "SERVICE_STACK_STATUS_STARTING": 6, - "SERVICE_STACK_STATUS_RESTARTING": 7, - "SERVICE_STACK_STATUS_RELOADING": 8, - "SERVICE_STACK_STATUS_DELETING": 9, - "SERVICE_STACK_STATUS_DELETED": 10, - "SERVICE_STACK_STATUS_FAILED": 11, - "SERVICE_STACK_STATUS_ACTION_FAILED": 29, - "SERVICE_STACK_STATUS_UPGRADING": 13, - "SERVICE_STACK_STATUS_READY_TO_DEPLOY": 14, - "SERVICE_STACK_STATUS_SERVICE_CREATING": 18, - "SERVICE_STACK_STATUS_SERVICE_ACTIVE": 35, - "SERVICE_STACK_STATUS_SERVICE_STOPPING": 21, - "SERVICE_STACK_STATUS_SERVICE_STOPPED": 22, - "SERVICE_STACK_STATUS_SERVICE_STARTING": 23, - "SERVICE_STACK_STATUS_SERVICE_RESTARTING": 24, - "SERVICE_STACK_STATUS_SERVICE_RELOADING": 25, - "SERVICE_STACK_STATUS_SERVICE_DELETING": 15, - "SERVICE_STACK_STATUS_SERVICE_DELETED": 36, - "SERVICE_STACK_STATUS_SERVICE_FAILED": 16, - "SERVICE_STACK_STATUS_SERVICE_ACTION_FAILED": 28, - "SERVICE_STACK_STATUS_SERVICE_REPAIRING": 17, - "SERVICE_STACK_STATUS_SERVICE_CONTAINER_FAILED": 19, - "SERVICE_STACK_STATUS_SERVICE_MOVING_CONTAINER": 20, - "SERVICE_STACK_STATUS_SERVICE_UPGRADING": 26, - "SERVICE_STACK_STATUS_SERVICE_SCALING": 37, - "SERVICE_STACK_STATUS_SERVICE_REPAIR_FAILED": 38, - "SERVICE_STACK_STATUS_REPAIRING": 30, - "SERVICE_STACK_STATUS_CONTAINER_FAILED": 31, - "SERVICE_STACK_STATUS_MOVING_CONTAINER": 32, - "SERVICE_STACK_STATUS_SCALING": 33, - "SERVICE_STACK_STATUS_REPAIR_FAILED": 34, - } -) - -func (x ServiceStackStatus) Enum() *ServiceStackStatus { - p := new(ServiceStackStatus) - *p = x - return p -} - -func (x ServiceStackStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ServiceStackStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[17].Descriptor() -} - -func (ServiceStackStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[17] -} - -func (x ServiceStackStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ServiceStackStatus.Descriptor instead. -func (ServiceStackStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{17} -} - -type ServiceStackTypeCategory int32 - -const ( - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_UNKNOWN ServiceStackTypeCategory = 0 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_CORE ServiceStackTypeCategory = 1 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_HTTP_L7_BALANCER ServiceStackTypeCategory = 2 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_STANDARD ServiceStackTypeCategory = 3 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_USER ServiceStackTypeCategory = 4 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_SHARED_STORAGE ServiceStackTypeCategory = 5 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_OBJECT_STORAGE ServiceStackTypeCategory = 6 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_BUILD ServiceStackTypeCategory = 7 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_INTERNAL ServiceStackTypeCategory = 8 - ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_PREPARE_RUNTIME ServiceStackTypeCategory = 9 -) - -// Enum value maps for ServiceStackTypeCategory. -var ( - ServiceStackTypeCategory_name = map[int32]string{ - 0: "SERVICE_STACK_TYPE_CATEGORY_UNKNOWN", - 1: "SERVICE_STACK_TYPE_CATEGORY_CORE", - 2: "SERVICE_STACK_TYPE_CATEGORY_HTTP_L7_BALANCER", - 3: "SERVICE_STACK_TYPE_CATEGORY_STANDARD", - 4: "SERVICE_STACK_TYPE_CATEGORY_USER", - 5: "SERVICE_STACK_TYPE_CATEGORY_SHARED_STORAGE", - 6: "SERVICE_STACK_TYPE_CATEGORY_OBJECT_STORAGE", - 7: "SERVICE_STACK_TYPE_CATEGORY_BUILD", - 8: "SERVICE_STACK_TYPE_CATEGORY_INTERNAL", - 9: "SERVICE_STACK_TYPE_CATEGORY_PREPARE_RUNTIME", - } - ServiceStackTypeCategory_value = map[string]int32{ - "SERVICE_STACK_TYPE_CATEGORY_UNKNOWN": 0, - "SERVICE_STACK_TYPE_CATEGORY_CORE": 1, - "SERVICE_STACK_TYPE_CATEGORY_HTTP_L7_BALANCER": 2, - "SERVICE_STACK_TYPE_CATEGORY_STANDARD": 3, - "SERVICE_STACK_TYPE_CATEGORY_USER": 4, - "SERVICE_STACK_TYPE_CATEGORY_SHARED_STORAGE": 5, - "SERVICE_STACK_TYPE_CATEGORY_OBJECT_STORAGE": 6, - "SERVICE_STACK_TYPE_CATEGORY_BUILD": 7, - "SERVICE_STACK_TYPE_CATEGORY_INTERNAL": 8, - "SERVICE_STACK_TYPE_CATEGORY_PREPARE_RUNTIME": 9, - } -) - -func (x ServiceStackTypeCategory) Enum() *ServiceStackTypeCategory { - p := new(ServiceStackTypeCategory) - *p = x - return p -} - -func (x ServiceStackTypeCategory) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ServiceStackTypeCategory) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[18].Descriptor() -} - -func (ServiceStackTypeCategory) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[18] -} - -func (x ServiceStackTypeCategory) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ServiceStackTypeCategory.Descriptor instead. -func (ServiceStackTypeCategory) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{18} -} - -type UserDataType int32 - -const ( - UserDataType_USER_DATA_TYPE_UNKNOWN UserDataType = 0 - UserDataType_USER_DATA_TYPE_RESTRICTED UserDataType = 1 - UserDataType_USER_DATA_TYPE_COMMON UserDataType = 2 - UserDataType_USER_DATA_TYPE_USER UserDataType = 3 - UserDataType_USER_DATA_TYPE_INTERNAL UserDataType = 4 -) - -// Enum value maps for UserDataType. -var ( - UserDataType_name = map[int32]string{ - 0: "USER_DATA_TYPE_UNKNOWN", - 1: "USER_DATA_TYPE_RESTRICTED", - 2: "USER_DATA_TYPE_COMMON", - 3: "USER_DATA_TYPE_USER", - 4: "USER_DATA_TYPE_INTERNAL", - } - UserDataType_value = map[string]int32{ - "USER_DATA_TYPE_UNKNOWN": 0, - "USER_DATA_TYPE_RESTRICTED": 1, - "USER_DATA_TYPE_COMMON": 2, - "USER_DATA_TYPE_USER": 3, - "USER_DATA_TYPE_INTERNAL": 4, - } -) - -func (x UserDataType) Enum() *UserDataType { - p := new(UserDataType) - *p = x - return p -} - -func (x UserDataType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (UserDataType) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[19].Descriptor() -} - -func (UserDataType) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[19] -} - -func (x UserDataType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use UserDataType.Descriptor instead. -func (UserDataType) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{19} -} - -type UserDataVersion int32 - -const ( - UserDataVersion_USER_DATA_VERSION_UNKNOWN UserDataVersion = 0 - UserDataVersion_USER_DATA_VERSION_USER UserDataVersion = 1 - UserDataVersion_USER_DATA_VERSION_INFRASTRUCTURE UserDataVersion = 2 -) - -// Enum value maps for UserDataVersion. -var ( - UserDataVersion_name = map[int32]string{ - 0: "USER_DATA_VERSION_UNKNOWN", - 1: "USER_DATA_VERSION_USER", - 2: "USER_DATA_VERSION_INFRASTRUCTURE", - } - UserDataVersion_value = map[string]int32{ - "USER_DATA_VERSION_UNKNOWN": 0, - "USER_DATA_VERSION_USER": 1, - "USER_DATA_VERSION_INFRASTRUCTURE": 2, - } -) - -func (x UserDataVersion) Enum() *UserDataVersion { - p := new(UserDataVersion) - *p = x - return p -} - -func (x UserDataVersion) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (UserDataVersion) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[20].Descriptor() -} - -func (UserDataVersion) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[20] -} - -func (x UserDataVersion) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use UserDataVersion.Descriptor instead. -func (UserDataVersion) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{20} -} - -type UserJsonObjectType int32 - -const ( - UserJsonObjectType_USER_JSON_OBJECT_TYPE_UNKNOWN UserJsonObjectType = 0 - UserJsonObjectType_USER_JSON_OBJECT_TYPE_GITHUB UserJsonObjectType = 1 - UserJsonObjectType_USER_JSON_OBJECT_TYPE_GITLAB UserJsonObjectType = 4 - UserJsonObjectType_USER_JSON_OBJECT_TYPE_USER UserJsonObjectType = 2 - UserJsonObjectType_USER_JSON_OBJECT_TYPE_SYSTEM UserJsonObjectType = 3 -) - -// Enum value maps for UserJsonObjectType. -var ( - UserJsonObjectType_name = map[int32]string{ - 0: "USER_JSON_OBJECT_TYPE_UNKNOWN", - 1: "USER_JSON_OBJECT_TYPE_GITHUB", - 4: "USER_JSON_OBJECT_TYPE_GITLAB", - 2: "USER_JSON_OBJECT_TYPE_USER", - 3: "USER_JSON_OBJECT_TYPE_SYSTEM", - } - UserJsonObjectType_value = map[string]int32{ - "USER_JSON_OBJECT_TYPE_UNKNOWN": 0, - "USER_JSON_OBJECT_TYPE_GITHUB": 1, - "USER_JSON_OBJECT_TYPE_GITLAB": 4, - "USER_JSON_OBJECT_TYPE_USER": 2, - "USER_JSON_OBJECT_TYPE_SYSTEM": 3, - } -) - -func (x UserJsonObjectType) Enum() *UserJsonObjectType { - p := new(UserJsonObjectType) - *p = x - return p -} - -func (x UserJsonObjectType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (UserJsonObjectType) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[21].Descriptor() -} - -func (UserJsonObjectType) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[21] -} - -func (x UserJsonObjectType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use UserJsonObjectType.Descriptor instead. -func (UserJsonObjectType) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{21} -} - -type UserStatus int32 - -const ( - UserStatus_USER_STATUS_UNKNOWN UserStatus = 0 - UserStatus_USER_STATUS_ACTIVE UserStatus = 1 - UserStatus_USER_STATUS_DELETED UserStatus = 2 -) - -// Enum value maps for UserStatus. -var ( - UserStatus_name = map[int32]string{ - 0: "USER_STATUS_UNKNOWN", - 1: "USER_STATUS_ACTIVE", - 2: "USER_STATUS_DELETED", - } - UserStatus_value = map[string]int32{ - "USER_STATUS_UNKNOWN": 0, - "USER_STATUS_ACTIVE": 1, - "USER_STATUS_DELETED": 2, - } -) - -func (x UserStatus) Enum() *UserStatus { - p := new(UserStatus) - *p = x - return p -} - -func (x UserStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (UserStatus) Descriptor() protoreflect.EnumDescriptor { - return file_zeropsApiProtocol_proto_enumTypes[22].Descriptor() -} - -func (UserStatus) Type() protoreflect.EnumType { - return &file_zeropsApiProtocol_proto_enumTypes[22] -} - -func (x UserStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use UserStatus.Descriptor instead. -func (UserStatus) EnumDescriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{22} -} - -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=zBusinessZeropsApiProtocol.ErrorCode" json:"code,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - Meta []byte `protobuf:"bytes,3,opt,name=meta,proto3" json:"meta,omitempty"` -} - -func (x *Error) Reset() { - *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{0} -} - -func (x *Error) GetCode() ErrorCode { - if x != nil { - return x.Code - } - return ErrorCode_NO_ERROR -} - -func (x *Error) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *Error) GetMeta() []byte { - if x != nil { - return x.Meta - } - return nil -} - -type ErrorNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *Error `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *ErrorNull) Reset() { - *x = ErrorNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ErrorNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ErrorNull) ProtoMessage() {} - -func (x *ErrorNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ErrorNull.ProtoReflect.Descriptor instead. -func (*ErrorNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{1} -} - -func (x *ErrorNull) GetValue() *Error { - if x != nil { - return x.Value - } - return nil -} - -func (x *ErrorNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type Timestamp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IsSet bool `protobuf:"varint,1,opt,name=isSet,proto3" json:"isSet,omitempty"` - Seconds int64 `protobuf:"varint,2,opt,name=seconds,proto3" json:"seconds,omitempty"` - Nanos int32 `protobuf:"varint,3,opt,name=nanos,proto3" json:"nanos,omitempty"` -} - -func (x *Timestamp) Reset() { - *x = Timestamp{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Timestamp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Timestamp) ProtoMessage() {} - -func (x *Timestamp) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Timestamp.ProtoReflect.Descriptor instead. -func (*Timestamp) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{2} -} - -func (x *Timestamp) GetIsSet() bool { - if x != nil { - return x.IsSet - } - return false -} - -func (x *Timestamp) GetSeconds() int64 { - if x != nil { - return x.Seconds - } - return 0 -} - -func (x *Timestamp) GetNanos() int32 { - if x != nil { - return x.Nanos - } - return 0 -} - -type DeleteProjectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *DeleteProjectRequest) Reset() { - *x = DeleteProjectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteProjectRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteProjectRequest) ProtoMessage() {} - -func (x *DeleteProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteProjectRequest.ProtoReflect.Descriptor instead. -func (*DeleteProjectRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{3} -} - -func (x *DeleteProjectRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type DeleteServiceStackRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *DeleteServiceStackRequest) Reset() { - *x = DeleteServiceStackRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteServiceStackRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteServiceStackRequest) ProtoMessage() {} - -func (x *DeleteServiceStackRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteServiceStackRequest.ProtoReflect.Descriptor instead. -func (*DeleteServiceStackRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{4} -} - -func (x *DeleteServiceStackRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type GetProcessRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *GetProcessRequest) Reset() { - *x = GetProcessRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetProcessRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetProcessRequest) ProtoMessage() {} - -func (x *GetProcessRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetProcessRequest.ProtoReflect.Descriptor instead. -func (*GetProcessRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{5} -} - -func (x *GetProcessRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type GetProjectsByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetProjectsByNameRequest) Reset() { - *x = GetProjectsByNameRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetProjectsByNameRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetProjectsByNameRequest) ProtoMessage() {} - -func (x *GetProjectsByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetProjectsByNameRequest.ProtoReflect.Descriptor instead. -func (*GetProjectsByNameRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{6} -} - -func (x *GetProjectsByNameRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type GetServiceStackRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *GetServiceStackRequest) Reset() { - *x = GetServiceStackRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetServiceStackRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetServiceStackRequest) ProtoMessage() {} - -func (x *GetServiceStackRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetServiceStackRequest.ProtoReflect.Descriptor instead. -func (*GetServiceStackRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{7} -} - -func (x *GetServiceStackRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type GetServiceStackByNameRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,2,opt,name=projectId,proto3" json:"projectId,omitempty"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetServiceStackByNameRequest) Reset() { - *x = GetServiceStackByNameRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetServiceStackByNameRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetServiceStackByNameRequest) ProtoMessage() {} - -func (x *GetServiceStackByNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetServiceStackByNameRequest.ProtoReflect.Descriptor instead. -func (*GetServiceStackByNameRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{8} -} - -func (x *GetServiceStackByNameRequest) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *GetServiceStackByNameRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type GetUserInfoRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *GetUserInfoRequest) Reset() { - *x = GetUserInfoRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUserInfoRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUserInfoRequest) ProtoMessage() {} - -func (x *GetUserInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUserInfoRequest.ProtoReflect.Descriptor instead. -func (*GetUserInfoRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{9} -} - -type PostAppVersionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ServiceStackId string `protobuf:"bytes,1,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Name *StringNull `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *PostAppVersionRequest) Reset() { - *x = PostAppVersionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostAppVersionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostAppVersionRequest) ProtoMessage() {} - -func (x *PostAppVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostAppVersionRequest.ProtoReflect.Descriptor instead. -func (*PostAppVersionRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{10} -} - -func (x *PostAppVersionRequest) GetServiceStackId() string { - if x != nil { - return x.ServiceStackId - } - return "" -} - -func (x *PostAppVersionRequest) GetName() *StringNull { - if x != nil { - return x.Name - } - return nil -} - -type PostProjectImportRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClientId string `protobuf:"bytes,1,opt,name=clientId,proto3" json:"clientId,omitempty"` - Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` -} - -func (x *PostProjectImportRequest) Reset() { - *x = PostProjectImportRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostProjectImportRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostProjectImportRequest) ProtoMessage() {} - -func (x *PostProjectImportRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostProjectImportRequest.ProtoReflect.Descriptor instead. -func (*PostProjectImportRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{11} -} - -func (x *PostProjectImportRequest) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PostProjectImportRequest) GetYaml() string { - if x != nil { - return x.Yaml - } - return "" -} - -type PostPublicHttpRoutingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,1,opt,name=projectId,proto3" json:"projectId,omitempty"` - SslEnabled bool `protobuf:"varint,2,opt,name=sslEnabled,proto3" json:"sslEnabled,omitempty"` - Domains []string `protobuf:"bytes,3,rep,name=domains,proto3" json:"domains,omitempty"` - Locations []*PublicHttpRoutingLocationPost `protobuf:"bytes,4,rep,name=locations,proto3" json:"locations,omitempty"` -} - -func (x *PostPublicHttpRoutingRequest) Reset() { - *x = PostPublicHttpRoutingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostPublicHttpRoutingRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostPublicHttpRoutingRequest) ProtoMessage() {} - -func (x *PostPublicHttpRoutingRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostPublicHttpRoutingRequest.ProtoReflect.Descriptor instead. -func (*PostPublicHttpRoutingRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{12} -} - -func (x *PostPublicHttpRoutingRequest) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PostPublicHttpRoutingRequest) GetSslEnabled() bool { - if x != nil { - return x.SslEnabled - } - return false -} - -func (x *PostPublicHttpRoutingRequest) GetDomains() []string { - if x != nil { - return x.Domains - } - return nil -} - -func (x *PostPublicHttpRoutingRequest) GetLocations() []*PublicHttpRoutingLocationPost { - if x != nil { - return x.Locations - } - return nil -} - -type PostServiceStackImportRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,1,opt,name=projectId,proto3" json:"projectId,omitempty"` - Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` -} - -func (x *PostServiceStackImportRequest) Reset() { - *x = PostServiceStackImportRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostServiceStackImportRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostServiceStackImportRequest) ProtoMessage() {} - -func (x *PostServiceStackImportRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostServiceStackImportRequest.ProtoReflect.Descriptor instead. -func (*PostServiceStackImportRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{13} -} - -func (x *PostServiceStackImportRequest) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PostServiceStackImportRequest) GetYaml() string { - if x != nil { - return x.Yaml - } - return "" -} - -type PostVpnRequestRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientPublicKey string `protobuf:"bytes,2,opt,name=clientPublicKey,proto3" json:"clientPublicKey,omitempty"` -} - -func (x *PostVpnRequestRequest) Reset() { - *x = PostVpnRequestRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostVpnRequestRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostVpnRequestRequest) ProtoMessage() {} - -func (x *PostVpnRequestRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostVpnRequestRequest.ProtoReflect.Descriptor instead. -func (*PostVpnRequestRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{14} -} - -func (x *PostVpnRequestRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PostVpnRequestRequest) GetClientPublicKey() string { - if x != nil { - return x.ClientPublicKey - } - return "" -} - -type PublicHttpRoutingLocationPost struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` - ServiceStackId string `protobuf:"bytes,3,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` -} - -func (x *PublicHttpRoutingLocationPost) Reset() { - *x = PublicHttpRoutingLocationPost{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PublicHttpRoutingLocationPost) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PublicHttpRoutingLocationPost) ProtoMessage() {} - -func (x *PublicHttpRoutingLocationPost) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PublicHttpRoutingLocationPost.ProtoReflect.Descriptor instead. -func (*PublicHttpRoutingLocationPost) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{15} -} - -func (x *PublicHttpRoutingLocationPost) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *PublicHttpRoutingLocationPost) GetPort() int32 { - if x != nil { - return x.Port - } - return 0 -} - -func (x *PublicHttpRoutingLocationPost) GetServiceStackId() string { - if x != nil { - return x.ServiceStackId - } - return "" -} - -type PutAppVersionBuildAndDeployRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - BuildConfigContent string `protobuf:"bytes,5,opt,name=buildConfigContent,proto3" json:"buildConfigContent,omitempty"` - Source *StringNull `protobuf:"bytes,7,opt,name=source,proto3" json:"source,omitempty"` -} - -func (x *PutAppVersionBuildAndDeployRequest) Reset() { - *x = PutAppVersionBuildAndDeployRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutAppVersionBuildAndDeployRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutAppVersionBuildAndDeployRequest) ProtoMessage() {} - -func (x *PutAppVersionBuildAndDeployRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutAppVersionBuildAndDeployRequest.ProtoReflect.Descriptor instead. -func (*PutAppVersionBuildAndDeployRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{16} -} - -func (x *PutAppVersionBuildAndDeployRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutAppVersionBuildAndDeployRequest) GetBuildConfigContent() string { - if x != nil { - return x.BuildConfigContent - } - return "" -} - -func (x *PutAppVersionBuildAndDeployRequest) GetSource() *StringNull { - if x != nil { - return x.Source - } - return nil -} - -type PutAppVersionDeployRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ConfigContent *StringNull `protobuf:"bytes,3,opt,name=configContent,proto3" json:"configContent,omitempty"` - Source *StringNull `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"` -} - -func (x *PutAppVersionDeployRequest) Reset() { - *x = PutAppVersionDeployRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutAppVersionDeployRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutAppVersionDeployRequest) ProtoMessage() {} - -func (x *PutAppVersionDeployRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutAppVersionDeployRequest.ProtoReflect.Descriptor instead. -func (*PutAppVersionDeployRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{17} -} - -func (x *PutAppVersionDeployRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutAppVersionDeployRequest) GetConfigContent() *StringNull { - if x != nil { - return x.ConfigContent - } - return nil -} - -func (x *PutAppVersionDeployRequest) GetSource() *StringNull { - if x != nil { - return x.Source - } - return nil -} - -type PutProjectStartRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *PutProjectStartRequest) Reset() { - *x = PutProjectStartRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutProjectStartRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutProjectStartRequest) ProtoMessage() {} - -func (x *PutProjectStartRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutProjectStartRequest.ProtoReflect.Descriptor instead. -func (*PutProjectStartRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{18} -} - -func (x *PutProjectStartRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PutProjectStopRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *PutProjectStopRequest) Reset() { - *x = PutProjectStopRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutProjectStopRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutProjectStopRequest) ProtoMessage() {} - -func (x *PutProjectStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutProjectStopRequest.ProtoReflect.Descriptor instead. -func (*PutProjectStopRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{19} -} - -func (x *PutProjectStopRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PutServiceStackRestartRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *PutServiceStackRestartRequest) Reset() { - *x = PutServiceStackRestartRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackRestartRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackRestartRequest) ProtoMessage() {} - -func (x *PutServiceStackRestartRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackRestartRequest.ProtoReflect.Descriptor instead. -func (*PutServiceStackRestartRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{20} -} - -func (x *PutServiceStackRestartRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PutServiceStackStartRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *PutServiceStackStartRequest) Reset() { - *x = PutServiceStackStartRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackStartRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackStartRequest) ProtoMessage() {} - -func (x *PutServiceStackStartRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackStartRequest.ProtoReflect.Descriptor instead. -func (*PutServiceStackStartRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{21} -} - -func (x *PutServiceStackStartRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PutServiceStackStopRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *PutServiceStackStopRequest) Reset() { - *x = PutServiceStackStopRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackStopRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackStopRequest) ProtoMessage() {} - -func (x *PutServiceStackStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackStopRequest.ProtoReflect.Descriptor instead. -func (*PutServiceStackStopRequest) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{22} -} - -func (x *PutServiceStackStopRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type DeleteProjectResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *DeleteProjectResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *DeleteProjectResponse) Reset() { - *x = DeleteProjectResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteProjectResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteProjectResponse) ProtoMessage() {} - -func (x *DeleteProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteProjectResponse.ProtoReflect.Descriptor instead. -func (*DeleteProjectResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{23} -} - -func (x *DeleteProjectResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *DeleteProjectResponse) GetOutput() *DeleteProjectResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type DeleteProjectResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *DeleteProjectResponseDto) Reset() { - *x = DeleteProjectResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteProjectResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteProjectResponseDto) ProtoMessage() {} - -func (x *DeleteProjectResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteProjectResponseDto.ProtoReflect.Descriptor instead. -func (*DeleteProjectResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{24} -} - -func (x *DeleteProjectResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *DeleteProjectResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *DeleteProjectResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *DeleteProjectResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *DeleteProjectResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *DeleteProjectResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *DeleteProjectResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *DeleteProjectResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *DeleteProjectResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *DeleteProjectResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *DeleteProjectResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *DeleteProjectResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *DeleteProjectResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *DeleteProjectResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *DeleteProjectResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *DeleteProjectResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *DeleteProjectResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type DeleteServiceStackResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *DeleteServiceStackResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *DeleteServiceStackResponse) Reset() { - *x = DeleteServiceStackResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteServiceStackResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteServiceStackResponse) ProtoMessage() {} - -func (x *DeleteServiceStackResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteServiceStackResponse.ProtoReflect.Descriptor instead. -func (*DeleteServiceStackResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{25} -} - -func (x *DeleteServiceStackResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *DeleteServiceStackResponse) GetOutput() *DeleteServiceStackResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type DeleteServiceStackResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *DeleteServiceStackResponseDto) Reset() { - *x = DeleteServiceStackResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteServiceStackResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteServiceStackResponseDto) ProtoMessage() {} - -func (x *DeleteServiceStackResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteServiceStackResponseDto.ProtoReflect.Descriptor instead. -func (*DeleteServiceStackResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{26} -} - -func (x *DeleteServiceStackResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *DeleteServiceStackResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *DeleteServiceStackResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *DeleteServiceStackResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *DeleteServiceStackResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *DeleteServiceStackResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *DeleteServiceStackResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *DeleteServiceStackResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *DeleteServiceStackResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type GetProcessResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *GetProcessResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *GetProcessResponse) Reset() { - *x = GetProcessResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetProcessResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetProcessResponse) ProtoMessage() {} - -func (x *GetProcessResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetProcessResponse.ProtoReflect.Descriptor instead. -func (*GetProcessResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{27} -} - -func (x *GetProcessResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *GetProcessResponse) GetOutput() *GetProcessResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type GetProcessResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,14,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,15,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,4,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,5,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,16,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,6,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,7,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,8,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,10,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,11,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,17,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,18,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,12,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,13,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *GetProcessResponseDto) Reset() { - *x = GetProcessResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetProcessResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetProcessResponseDto) ProtoMessage() {} - -func (x *GetProcessResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetProcessResponseDto.ProtoReflect.Descriptor instead. -func (*GetProcessResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{28} -} - -func (x *GetProcessResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *GetProcessResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *GetProcessResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *GetProcessResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *GetProcessResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *GetProcessResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *GetProcessResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *GetProcessResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *GetProcessResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *GetProcessResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *GetProcessResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *GetProcessResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *GetProcessResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *GetProcessResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *GetProcessResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *GetProcessResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *GetProcessResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type GetProjectsByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *GetProjectsByNameResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *GetProjectsByNameResponse) Reset() { - *x = GetProjectsByNameResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetProjectsByNameResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetProjectsByNameResponse) ProtoMessage() {} - -func (x *GetProjectsByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetProjectsByNameResponse.ProtoReflect.Descriptor instead. -func (*GetProjectsByNameResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{29} -} - -func (x *GetProjectsByNameResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *GetProjectsByNameResponse) GetOutput() *GetProjectsByNameResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type GetProjectsByNameResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Projects []*Project `protobuf:"bytes,1,rep,name=projects,proto3" json:"projects,omitempty"` -} - -func (x *GetProjectsByNameResponseDto) Reset() { - *x = GetProjectsByNameResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetProjectsByNameResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetProjectsByNameResponseDto) ProtoMessage() {} - -func (x *GetProjectsByNameResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetProjectsByNameResponseDto.ProtoReflect.Descriptor instead. -func (*GetProjectsByNameResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{30} -} - -func (x *GetProjectsByNameResponseDto) GetProjects() []*Project { - if x != nil { - return x.Projects - } - return nil -} - -type GetServiceStackResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *GetServiceStackResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *GetServiceStackResponse) Reset() { - *x = GetServiceStackResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetServiceStackResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetServiceStackResponse) ProtoMessage() {} - -func (x *GetServiceStackResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetServiceStackResponse.ProtoReflect.Descriptor instead. -func (*GetServiceStackResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{31} -} - -func (x *GetServiceStackResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *GetServiceStackResponse) GetOutput() *GetServiceStackResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type GetServiceStackResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Status ServiceStackStatus `protobuf:"varint,2,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackStatus" json:"status,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - ServiceStackTypeInfo *ServiceStackInfoJsonObject `protobuf:"bytes,4,opt,name=serviceStackTypeInfo,proto3" json:"serviceStackTypeInfo,omitempty"` - ServiceStackTypeId string `protobuf:"bytes,5,opt,name=serviceStackTypeId,proto3" json:"serviceStackTypeId,omitempty"` - ServiceStackTypeVersionId string `protobuf:"bytes,6,opt,name=serviceStackTypeVersionId,proto3" json:"serviceStackTypeVersionId,omitempty"` - IsSystem bool `protobuf:"varint,7,opt,name=isSystem,proto3" json:"isSystem,omitempty"` - StartOnProjectStart bool `protobuf:"varint,31,opt,name=startOnProjectStart,proto3" json:"startOnProjectStart,omitempty"` - GithubIntegration *GithubIntegrationNull `protobuf:"bytes,26,opt,name=githubIntegration,proto3" json:"githubIntegration,omitempty"` - GitlabIntegration *GitlabIntegrationNull `protobuf:"bytes,29,opt,name=gitlabIntegration,proto3" json:"gitlabIntegration,omitempty"` - CustomAutoscaling *CustomAutoscalingNull `protobuf:"bytes,33,opt,name=customAutoscaling,proto3" json:"customAutoscaling,omitempty"` - Ports []*ServicePort `protobuf:"bytes,8,rep,name=ports,proto3" json:"ports,omitempty"` - RequestedPorts *RequestedPortsJsonObject `protobuf:"bytes,9,opt,name=requestedPorts,proto3" json:"requestedPorts,omitempty"` - Created *Timestamp `protobuf:"bytes,10,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,11,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Mode ServiceStackMode `protobuf:"varint,12,opt,name=mode,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackMode" json:"mode,omitempty"` - CustomPortsEnabled bool `protobuf:"varint,13,opt,name=customPortsEnabled,proto3" json:"customPortsEnabled,omitempty"` - SubdomainAccess bool `protobuf:"varint,14,opt,name=subdomainAccess,proto3" json:"subdomainAccess,omitempty"` - ReloadAvailable bool `protobuf:"varint,15,opt,name=reloadAvailable,proto3" json:"reloadAvailable,omitempty"` - VersionNumber string `protobuf:"bytes,16,opt,name=versionNumber,proto3" json:"versionNumber,omitempty"` - ProjectId string `protobuf:"bytes,32,opt,name=projectId,proto3" json:"projectId,omitempty"` - Project *ProjectLight `protobuf:"bytes,17,opt,name=project,proto3" json:"project,omitempty"` - ConnectedStacks []*ServiceStackConnectedServiceStack `protobuf:"bytes,18,rep,name=connectedStacks,proto3" json:"connectedStacks,omitempty"` - UserData []*UserDataLight `protobuf:"bytes,34,rep,name=userData,proto3" json:"userData,omitempty"` - ActiveAppVersion *AppVersionLightNull `protobuf:"bytes,19,opt,name=activeAppVersion,proto3" json:"activeAppVersion,omitempty"` - HasUnsyncedUserDataRecord bool `protobuf:"varint,20,opt,name=hasUnsyncedUserDataRecord,proto3" json:"hasUnsyncedUserDataRecord,omitempty"` - HasUnsyncedPublicHttpRoutingRecord bool `protobuf:"varint,21,opt,name=hasUnsyncedPublicHttpRoutingRecord,proto3" json:"hasUnsyncedPublicHttpRoutingRecord,omitempty"` - HasUnsyncedPublicPortRecord bool `protobuf:"varint,22,opt,name=hasUnsyncedPublicPortRecord,proto3" json:"hasUnsyncedPublicPortRecord,omitempty"` - HasPublicPortRoutingAccess bool `protobuf:"varint,24,opt,name=hasPublicPortRoutingAccess,proto3" json:"hasPublicPortRoutingAccess,omitempty"` - HasPublicHttpRoutingAccess bool `protobuf:"varint,25,opt,name=hasPublicHttpRoutingAccess,proto3" json:"hasPublicHttpRoutingAccess,omitempty"` - ActivePublicHttpRoutingCount *Int32Null `protobuf:"bytes,27,opt,name=activePublicHttpRoutingCount,proto3" json:"activePublicHttpRoutingCount,omitempty"` - ActivePublicPortRoutingCount *Int32Null `protobuf:"bytes,28,opt,name=activePublicPortRoutingCount,proto3" json:"activePublicPortRoutingCount,omitempty"` -} - -func (x *GetServiceStackResponseDto) Reset() { - *x = GetServiceStackResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetServiceStackResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetServiceStackResponseDto) ProtoMessage() {} - -func (x *GetServiceStackResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetServiceStackResponseDto.ProtoReflect.Descriptor instead. -func (*GetServiceStackResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{32} -} - -func (x *GetServiceStackResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *GetServiceStackResponseDto) GetStatus() ServiceStackStatus { - if x != nil { - return x.Status - } - return ServiceStackStatus_SERVICE_STACK_STATUS_UNKNOWN -} - -func (x *GetServiceStackResponseDto) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *GetServiceStackResponseDto) GetServiceStackTypeInfo() *ServiceStackInfoJsonObject { - if x != nil { - return x.ServiceStackTypeInfo - } - return nil -} - -func (x *GetServiceStackResponseDto) GetServiceStackTypeId() string { - if x != nil { - return x.ServiceStackTypeId - } - return "" -} - -func (x *GetServiceStackResponseDto) GetServiceStackTypeVersionId() string { - if x != nil { - return x.ServiceStackTypeVersionId - } - return "" -} - -func (x *GetServiceStackResponseDto) GetIsSystem() bool { - if x != nil { - return x.IsSystem - } - return false -} - -func (x *GetServiceStackResponseDto) GetStartOnProjectStart() bool { - if x != nil { - return x.StartOnProjectStart - } - return false -} - -func (x *GetServiceStackResponseDto) GetGithubIntegration() *GithubIntegrationNull { - if x != nil { - return x.GithubIntegration - } - return nil -} - -func (x *GetServiceStackResponseDto) GetGitlabIntegration() *GitlabIntegrationNull { - if x != nil { - return x.GitlabIntegration - } - return nil -} - -func (x *GetServiceStackResponseDto) GetCustomAutoscaling() *CustomAutoscalingNull { - if x != nil { - return x.CustomAutoscaling - } - return nil -} - -func (x *GetServiceStackResponseDto) GetPorts() []*ServicePort { - if x != nil { - return x.Ports - } - return nil -} - -func (x *GetServiceStackResponseDto) GetRequestedPorts() *RequestedPortsJsonObject { - if x != nil { - return x.RequestedPorts - } - return nil -} - -func (x *GetServiceStackResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *GetServiceStackResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *GetServiceStackResponseDto) GetMode() ServiceStackMode { - if x != nil { - return x.Mode - } - return ServiceStackMode_SERVICE_STACK_MODE_UNKNOWN -} - -func (x *GetServiceStackResponseDto) GetCustomPortsEnabled() bool { - if x != nil { - return x.CustomPortsEnabled - } - return false -} - -func (x *GetServiceStackResponseDto) GetSubdomainAccess() bool { - if x != nil { - return x.SubdomainAccess - } - return false -} - -func (x *GetServiceStackResponseDto) GetReloadAvailable() bool { - if x != nil { - return x.ReloadAvailable - } - return false -} - -func (x *GetServiceStackResponseDto) GetVersionNumber() string { - if x != nil { - return x.VersionNumber - } - return "" -} - -func (x *GetServiceStackResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *GetServiceStackResponseDto) GetProject() *ProjectLight { - if x != nil { - return x.Project - } - return nil -} - -func (x *GetServiceStackResponseDto) GetConnectedStacks() []*ServiceStackConnectedServiceStack { - if x != nil { - return x.ConnectedStacks - } - return nil -} - -func (x *GetServiceStackResponseDto) GetUserData() []*UserDataLight { - if x != nil { - return x.UserData - } - return nil -} - -func (x *GetServiceStackResponseDto) GetActiveAppVersion() *AppVersionLightNull { - if x != nil { - return x.ActiveAppVersion - } - return nil -} - -func (x *GetServiceStackResponseDto) GetHasUnsyncedUserDataRecord() bool { - if x != nil { - return x.HasUnsyncedUserDataRecord - } - return false -} - -func (x *GetServiceStackResponseDto) GetHasUnsyncedPublicHttpRoutingRecord() bool { - if x != nil { - return x.HasUnsyncedPublicHttpRoutingRecord - } - return false -} - -func (x *GetServiceStackResponseDto) GetHasUnsyncedPublicPortRecord() bool { - if x != nil { - return x.HasUnsyncedPublicPortRecord - } - return false -} - -func (x *GetServiceStackResponseDto) GetHasPublicPortRoutingAccess() bool { - if x != nil { - return x.HasPublicPortRoutingAccess - } - return false -} - -func (x *GetServiceStackResponseDto) GetHasPublicHttpRoutingAccess() bool { - if x != nil { - return x.HasPublicHttpRoutingAccess - } - return false -} - -func (x *GetServiceStackResponseDto) GetActivePublicHttpRoutingCount() *Int32Null { - if x != nil { - return x.ActivePublicHttpRoutingCount - } - return nil -} - -func (x *GetServiceStackResponseDto) GetActivePublicPortRoutingCount() *Int32Null { - if x != nil { - return x.ActivePublicPortRoutingCount - } - return nil -} - -type GetServiceStackByNameResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *GetServiceStackByNameResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *GetServiceStackByNameResponse) Reset() { - *x = GetServiceStackByNameResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetServiceStackByNameResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetServiceStackByNameResponse) ProtoMessage() {} - -func (x *GetServiceStackByNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetServiceStackByNameResponse.ProtoReflect.Descriptor instead. -func (*GetServiceStackByNameResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{33} -} - -func (x *GetServiceStackByNameResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *GetServiceStackByNameResponse) GetOutput() *GetServiceStackByNameResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type GetServiceStackByNameResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Status ServiceStackStatus `protobuf:"varint,2,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackStatus" json:"status,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - ServiceStackTypeInfo *ServiceStackInfoJsonObject `protobuf:"bytes,4,opt,name=serviceStackTypeInfo,proto3" json:"serviceStackTypeInfo,omitempty"` - ServiceStackTypeId string `protobuf:"bytes,5,opt,name=serviceStackTypeId,proto3" json:"serviceStackTypeId,omitempty"` - ServiceStackTypeVersionId string `protobuf:"bytes,6,opt,name=serviceStackTypeVersionId,proto3" json:"serviceStackTypeVersionId,omitempty"` - IsSystem bool `protobuf:"varint,7,opt,name=isSystem,proto3" json:"isSystem,omitempty"` - StartOnProjectStart bool `protobuf:"varint,31,opt,name=startOnProjectStart,proto3" json:"startOnProjectStart,omitempty"` - GithubIntegration *GithubIntegrationNull `protobuf:"bytes,26,opt,name=githubIntegration,proto3" json:"githubIntegration,omitempty"` - GitlabIntegration *GitlabIntegrationNull `protobuf:"bytes,29,opt,name=gitlabIntegration,proto3" json:"gitlabIntegration,omitempty"` - CustomAutoscaling *CustomAutoscalingNull `protobuf:"bytes,33,opt,name=customAutoscaling,proto3" json:"customAutoscaling,omitempty"` - Ports []*ServicePort `protobuf:"bytes,8,rep,name=ports,proto3" json:"ports,omitempty"` - RequestedPorts *RequestedPortsJsonObject `protobuf:"bytes,9,opt,name=requestedPorts,proto3" json:"requestedPorts,omitempty"` - Created *Timestamp `protobuf:"bytes,10,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,11,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Mode ServiceStackMode `protobuf:"varint,12,opt,name=mode,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackMode" json:"mode,omitempty"` - CustomPortsEnabled bool `protobuf:"varint,13,opt,name=customPortsEnabled,proto3" json:"customPortsEnabled,omitempty"` - SubdomainAccess bool `protobuf:"varint,14,opt,name=subdomainAccess,proto3" json:"subdomainAccess,omitempty"` - ReloadAvailable bool `protobuf:"varint,15,opt,name=reloadAvailable,proto3" json:"reloadAvailable,omitempty"` - VersionNumber string `protobuf:"bytes,16,opt,name=versionNumber,proto3" json:"versionNumber,omitempty"` - ProjectId string `protobuf:"bytes,32,opt,name=projectId,proto3" json:"projectId,omitempty"` - Project *ProjectLight `protobuf:"bytes,17,opt,name=project,proto3" json:"project,omitempty"` - ConnectedStacks []*ServiceStackConnectedServiceStack `protobuf:"bytes,18,rep,name=connectedStacks,proto3" json:"connectedStacks,omitempty"` - UserData []*UserDataLight `protobuf:"bytes,34,rep,name=userData,proto3" json:"userData,omitempty"` - ActiveAppVersion *AppVersionLightNull `protobuf:"bytes,19,opt,name=activeAppVersion,proto3" json:"activeAppVersion,omitempty"` - HasUnsyncedUserDataRecord bool `protobuf:"varint,20,opt,name=hasUnsyncedUserDataRecord,proto3" json:"hasUnsyncedUserDataRecord,omitempty"` - HasUnsyncedPublicHttpRoutingRecord bool `protobuf:"varint,21,opt,name=hasUnsyncedPublicHttpRoutingRecord,proto3" json:"hasUnsyncedPublicHttpRoutingRecord,omitempty"` - HasUnsyncedPublicPortRecord bool `protobuf:"varint,22,opt,name=hasUnsyncedPublicPortRecord,proto3" json:"hasUnsyncedPublicPortRecord,omitempty"` - HasPublicPortRoutingAccess bool `protobuf:"varint,24,opt,name=hasPublicPortRoutingAccess,proto3" json:"hasPublicPortRoutingAccess,omitempty"` - HasPublicHttpRoutingAccess bool `protobuf:"varint,25,opt,name=hasPublicHttpRoutingAccess,proto3" json:"hasPublicHttpRoutingAccess,omitempty"` - ActivePublicHttpRoutingCount *Int32Null `protobuf:"bytes,27,opt,name=activePublicHttpRoutingCount,proto3" json:"activePublicHttpRoutingCount,omitempty"` - ActivePublicPortRoutingCount *Int32Null `protobuf:"bytes,28,opt,name=activePublicPortRoutingCount,proto3" json:"activePublicPortRoutingCount,omitempty"` -} - -func (x *GetServiceStackByNameResponseDto) Reset() { - *x = GetServiceStackByNameResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetServiceStackByNameResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetServiceStackByNameResponseDto) ProtoMessage() {} - -func (x *GetServiceStackByNameResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetServiceStackByNameResponseDto.ProtoReflect.Descriptor instead. -func (*GetServiceStackByNameResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{34} -} - -func (x *GetServiceStackByNameResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *GetServiceStackByNameResponseDto) GetStatus() ServiceStackStatus { - if x != nil { - return x.Status - } - return ServiceStackStatus_SERVICE_STACK_STATUS_UNKNOWN -} - -func (x *GetServiceStackByNameResponseDto) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *GetServiceStackByNameResponseDto) GetServiceStackTypeInfo() *ServiceStackInfoJsonObject { - if x != nil { - return x.ServiceStackTypeInfo - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetServiceStackTypeId() string { - if x != nil { - return x.ServiceStackTypeId - } - return "" -} - -func (x *GetServiceStackByNameResponseDto) GetServiceStackTypeVersionId() string { - if x != nil { - return x.ServiceStackTypeVersionId - } - return "" -} - -func (x *GetServiceStackByNameResponseDto) GetIsSystem() bool { - if x != nil { - return x.IsSystem - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetStartOnProjectStart() bool { - if x != nil { - return x.StartOnProjectStart - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetGithubIntegration() *GithubIntegrationNull { - if x != nil { - return x.GithubIntegration - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetGitlabIntegration() *GitlabIntegrationNull { - if x != nil { - return x.GitlabIntegration - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetCustomAutoscaling() *CustomAutoscalingNull { - if x != nil { - return x.CustomAutoscaling - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetPorts() []*ServicePort { - if x != nil { - return x.Ports - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetRequestedPorts() *RequestedPortsJsonObject { - if x != nil { - return x.RequestedPorts - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetMode() ServiceStackMode { - if x != nil { - return x.Mode - } - return ServiceStackMode_SERVICE_STACK_MODE_UNKNOWN -} - -func (x *GetServiceStackByNameResponseDto) GetCustomPortsEnabled() bool { - if x != nil { - return x.CustomPortsEnabled - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetSubdomainAccess() bool { - if x != nil { - return x.SubdomainAccess - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetReloadAvailable() bool { - if x != nil { - return x.ReloadAvailable - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetVersionNumber() string { - if x != nil { - return x.VersionNumber - } - return "" -} - -func (x *GetServiceStackByNameResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *GetServiceStackByNameResponseDto) GetProject() *ProjectLight { - if x != nil { - return x.Project - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetConnectedStacks() []*ServiceStackConnectedServiceStack { - if x != nil { - return x.ConnectedStacks - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetUserData() []*UserDataLight { - if x != nil { - return x.UserData - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetActiveAppVersion() *AppVersionLightNull { - if x != nil { - return x.ActiveAppVersion - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetHasUnsyncedUserDataRecord() bool { - if x != nil { - return x.HasUnsyncedUserDataRecord - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetHasUnsyncedPublicHttpRoutingRecord() bool { - if x != nil { - return x.HasUnsyncedPublicHttpRoutingRecord - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetHasUnsyncedPublicPortRecord() bool { - if x != nil { - return x.HasUnsyncedPublicPortRecord - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetHasPublicPortRoutingAccess() bool { - if x != nil { - return x.HasPublicPortRoutingAccess - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetHasPublicHttpRoutingAccess() bool { - if x != nil { - return x.HasPublicHttpRoutingAccess - } - return false -} - -func (x *GetServiceStackByNameResponseDto) GetActivePublicHttpRoutingCount() *Int32Null { - if x != nil { - return x.ActivePublicHttpRoutingCount - } - return nil -} - -func (x *GetServiceStackByNameResponseDto) GetActivePublicPortRoutingCount() *Int32Null { - if x != nil { - return x.ActivePublicPortRoutingCount - } - return nil -} - -type GetUserInfoResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *GetUserInfoResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *GetUserInfoResponse) Reset() { - *x = GetUserInfoResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUserInfoResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUserInfoResponse) ProtoMessage() {} - -func (x *GetUserInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUserInfoResponse.ProtoReflect.Descriptor instead. -func (*GetUserInfoResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{35} -} - -func (x *GetUserInfoResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *GetUserInfoResponse) GetOutput() *GetUserInfoResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type GetUserInfoResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - FullName string `protobuf:"bytes,3,opt,name=fullName,proto3" json:"fullName,omitempty"` - FirstName string `protobuf:"bytes,4,opt,name=firstName,proto3" json:"firstName,omitempty"` - LastName string `protobuf:"bytes,5,opt,name=lastName,proto3" json:"lastName,omitempty"` - Avatar *UserAvatarNull `protobuf:"bytes,13,opt,name=avatar,proto3" json:"avatar,omitempty"` - CountryCallingCode *Int32Null `protobuf:"bytes,6,opt,name=countryCallingCode,proto3" json:"countryCallingCode,omitempty"` - PhoneNumber *Int32Null `protobuf:"bytes,7,opt,name=phoneNumber,proto3" json:"phoneNumber,omitempty"` - Language *Language `protobuf:"bytes,8,opt,name=language,proto3" json:"language,omitempty"` - Created *Timestamp `protobuf:"bytes,9,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,10,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Status UserStatus `protobuf:"varint,11,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.UserStatus" json:"status,omitempty"` - ClientUserList []*ClientUserExtra `protobuf:"bytes,12,rep,name=clientUserList,proto3" json:"clientUserList,omitempty"` - PasswordIsSet bool `protobuf:"varint,14,opt,name=passwordIsSet,proto3" json:"passwordIsSet,omitempty"` -} - -func (x *GetUserInfoResponseDto) Reset() { - *x = GetUserInfoResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetUserInfoResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetUserInfoResponseDto) ProtoMessage() {} - -func (x *GetUserInfoResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetUserInfoResponseDto.ProtoReflect.Descriptor instead. -func (*GetUserInfoResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{36} -} - -func (x *GetUserInfoResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *GetUserInfoResponseDto) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *GetUserInfoResponseDto) GetFullName() string { - if x != nil { - return x.FullName - } - return "" -} - -func (x *GetUserInfoResponseDto) GetFirstName() string { - if x != nil { - return x.FirstName - } - return "" -} - -func (x *GetUserInfoResponseDto) GetLastName() string { - if x != nil { - return x.LastName - } - return "" -} - -func (x *GetUserInfoResponseDto) GetAvatar() *UserAvatarNull { - if x != nil { - return x.Avatar - } - return nil -} - -func (x *GetUserInfoResponseDto) GetCountryCallingCode() *Int32Null { - if x != nil { - return x.CountryCallingCode - } - return nil -} - -func (x *GetUserInfoResponseDto) GetPhoneNumber() *Int32Null { - if x != nil { - return x.PhoneNumber - } - return nil -} - -func (x *GetUserInfoResponseDto) GetLanguage() *Language { - if x != nil { - return x.Language - } - return nil -} - -func (x *GetUserInfoResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *GetUserInfoResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *GetUserInfoResponseDto) GetStatus() UserStatus { - if x != nil { - return x.Status - } - return UserStatus_USER_STATUS_UNKNOWN -} - -func (x *GetUserInfoResponseDto) GetClientUserList() []*ClientUserExtra { - if x != nil { - return x.ClientUserList - } - return nil -} - -func (x *GetUserInfoResponseDto) GetPasswordIsSet() bool { - if x != nil { - return x.PasswordIsSet - } - return false -} - -type PostAppVersionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PostAppVersionResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PostAppVersionResponse) Reset() { - *x = PostAppVersionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostAppVersionResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostAppVersionResponse) ProtoMessage() {} - -func (x *PostAppVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostAppVersionResponse.ProtoReflect.Descriptor instead. -func (*PostAppVersionResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{37} -} - -func (x *PostAppVersionResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PostAppVersionResponse) GetOutput() *PostAppVersionResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PostAppVersionResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId string `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Build *AppVersionBuildNull `protobuf:"bytes,13,opt,name=build,proto3" json:"build,omitempty"` - Sequence int32 `protobuf:"varint,5,opt,name=sequence,proto3" json:"sequence,omitempty"` - Status AppVersionStatus `protobuf:"varint,6,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.AppVersionStatus" json:"status,omitempty"` - UserDataList []*AppVersionUserData `protobuf:"bytes,7,rep,name=userDataList,proto3" json:"userDataList,omitempty"` - Created *Timestamp `protobuf:"bytes,8,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,9,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - UploadUrl string `protobuf:"bytes,10,opt,name=uploadUrl,proto3" json:"uploadUrl,omitempty"` -} - -func (x *PostAppVersionResponseDto) Reset() { - *x = PostAppVersionResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostAppVersionResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostAppVersionResponseDto) ProtoMessage() {} - -func (x *PostAppVersionResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostAppVersionResponseDto.ProtoReflect.Descriptor instead. -func (*PostAppVersionResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{38} -} - -func (x *PostAppVersionResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PostAppVersionResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PostAppVersionResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PostAppVersionResponseDto) GetServiceStackId() string { - if x != nil { - return x.ServiceStackId - } - return "" -} - -func (x *PostAppVersionResponseDto) GetBuild() *AppVersionBuildNull { - if x != nil { - return x.Build - } - return nil -} - -func (x *PostAppVersionResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PostAppVersionResponseDto) GetStatus() AppVersionStatus { - if x != nil { - return x.Status - } - return AppVersionStatus_APP_VERSION_STATUS_UNKNOWN -} - -func (x *PostAppVersionResponseDto) GetUserDataList() []*AppVersionUserData { - if x != nil { - return x.UserDataList - } - return nil -} - -func (x *PostAppVersionResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PostAppVersionResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PostAppVersionResponseDto) GetUploadUrl() string { - if x != nil { - return x.UploadUrl - } - return "" -} - -type PostProjectImportResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PostProjectImportResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PostProjectImportResponse) Reset() { - *x = PostProjectImportResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostProjectImportResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostProjectImportResponse) ProtoMessage() {} - -func (x *PostProjectImportResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostProjectImportResponse.ProtoReflect.Descriptor instead. -func (*PostProjectImportResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{39} -} - -func (x *PostProjectImportResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PostProjectImportResponse) GetOutput() *PostProjectImportResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PostProjectImportResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,1,opt,name=projectId,proto3" json:"projectId,omitempty"` - ProjectName string `protobuf:"bytes,2,opt,name=projectName,proto3" json:"projectName,omitempty"` - ServiceStacks []*ProjectImportServiceStack `protobuf:"bytes,3,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` -} - -func (x *PostProjectImportResponseDto) Reset() { - *x = PostProjectImportResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostProjectImportResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostProjectImportResponseDto) ProtoMessage() {} - -func (x *PostProjectImportResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostProjectImportResponseDto.ProtoReflect.Descriptor instead. -func (*PostProjectImportResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{40} -} - -func (x *PostProjectImportResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PostProjectImportResponseDto) GetProjectName() string { - if x != nil { - return x.ProjectName - } - return "" -} - -func (x *PostProjectImportResponseDto) GetServiceStacks() []*ProjectImportServiceStack { - if x != nil { - return x.ServiceStacks - } - return nil -} - -type PostPublicHttpRoutingResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PostPublicHttpRoutingResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PostPublicHttpRoutingResponse) Reset() { - *x = PostPublicHttpRoutingResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostPublicHttpRoutingResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostPublicHttpRoutingResponse) ProtoMessage() {} - -func (x *PostPublicHttpRoutingResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostPublicHttpRoutingResponse.ProtoReflect.Descriptor instead. -func (*PostPublicHttpRoutingResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{41} -} - -func (x *PostPublicHttpRoutingResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PostPublicHttpRoutingResponse) GetOutput() *PostPublicHttpRoutingResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PostPublicHttpRoutingResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - SslEnabled bool `protobuf:"varint,4,opt,name=sslEnabled,proto3" json:"sslEnabled,omitempty"` - Domains []*PublicHttpRoutingDomain `protobuf:"bytes,5,rep,name=domains,proto3" json:"domains,omitempty"` - Locations []*PublicHttpRoutingLocation `protobuf:"bytes,6,rep,name=locations,proto3" json:"locations,omitempty"` - Created *Timestamp `protobuf:"bytes,7,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,8,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - IsSynced bool `protobuf:"varint,9,opt,name=isSynced,proto3" json:"isSynced,omitempty"` - IsEditable bool `protobuf:"varint,11,opt,name=isEditable,proto3" json:"isEditable,omitempty"` - DeleteOnSync bool `protobuf:"varint,12,opt,name=deleteOnSync,proto3" json:"deleteOnSync,omitempty"` -} - -func (x *PostPublicHttpRoutingResponseDto) Reset() { - *x = PostPublicHttpRoutingResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostPublicHttpRoutingResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostPublicHttpRoutingResponseDto) ProtoMessage() {} - -func (x *PostPublicHttpRoutingResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostPublicHttpRoutingResponseDto.ProtoReflect.Descriptor instead. -func (*PostPublicHttpRoutingResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{42} -} - -func (x *PostPublicHttpRoutingResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PostPublicHttpRoutingResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PostPublicHttpRoutingResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PostPublicHttpRoutingResponseDto) GetSslEnabled() bool { - if x != nil { - return x.SslEnabled - } - return false -} - -func (x *PostPublicHttpRoutingResponseDto) GetDomains() []*PublicHttpRoutingDomain { - if x != nil { - return x.Domains - } - return nil -} - -func (x *PostPublicHttpRoutingResponseDto) GetLocations() []*PublicHttpRoutingLocation { - if x != nil { - return x.Locations - } - return nil -} - -func (x *PostPublicHttpRoutingResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PostPublicHttpRoutingResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PostPublicHttpRoutingResponseDto) GetIsSynced() bool { - if x != nil { - return x.IsSynced - } - return false -} - -func (x *PostPublicHttpRoutingResponseDto) GetIsEditable() bool { - if x != nil { - return x.IsEditable - } - return false -} - -func (x *PostPublicHttpRoutingResponseDto) GetDeleteOnSync() bool { - if x != nil { - return x.DeleteOnSync - } - return false -} - -type PostServiceStackImportResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PostServiceStackImportResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PostServiceStackImportResponse) Reset() { - *x = PostServiceStackImportResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostServiceStackImportResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostServiceStackImportResponse) ProtoMessage() {} - -func (x *PostServiceStackImportResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostServiceStackImportResponse.ProtoReflect.Descriptor instead. -func (*PostServiceStackImportResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{43} -} - -func (x *PostServiceStackImportResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PostServiceStackImportResponse) GetOutput() *PostServiceStackImportResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PostServiceStackImportResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProjectId string `protobuf:"bytes,1,opt,name=projectId,proto3" json:"projectId,omitempty"` - ProjectName string `protobuf:"bytes,2,opt,name=projectName,proto3" json:"projectName,omitempty"` - ServiceStacks []*ProjectImportServiceStack `protobuf:"bytes,3,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` -} - -func (x *PostServiceStackImportResponseDto) Reset() { - *x = PostServiceStackImportResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostServiceStackImportResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostServiceStackImportResponseDto) ProtoMessage() {} - -func (x *PostServiceStackImportResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostServiceStackImportResponseDto.ProtoReflect.Descriptor instead. -func (*PostServiceStackImportResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{44} -} - -func (x *PostServiceStackImportResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PostServiceStackImportResponseDto) GetProjectName() string { - if x != nil { - return x.ProjectName - } - return "" -} - -func (x *PostServiceStackImportResponseDto) GetServiceStacks() []*ProjectImportServiceStack { - if x != nil { - return x.ServiceStacks - } - return nil -} - -type PostVpnRequestResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PostVpnRequestResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PostVpnRequestResponse) Reset() { - *x = PostVpnRequestResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostVpnRequestResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostVpnRequestResponse) ProtoMessage() {} - -func (x *PostVpnRequestResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostVpnRequestResponse.ProtoReflect.Descriptor instead. -func (*PostVpnRequestResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{45} -} - -func (x *PostVpnRequestResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PostVpnRequestResponse) GetOutput() *PostVpnRequestResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PostVpnRequestResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AccessToken string `protobuf:"bytes,1,opt,name=accessToken,proto3" json:"accessToken,omitempty"` - Expiry *Timestamp `protobuf:"bytes,2,opt,name=expiry,proto3" json:"expiry,omitempty"` -} - -func (x *PostVpnRequestResponseDto) Reset() { - *x = PostVpnRequestResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PostVpnRequestResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PostVpnRequestResponseDto) ProtoMessage() {} - -func (x *PostVpnRequestResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PostVpnRequestResponseDto.ProtoReflect.Descriptor instead. -func (*PostVpnRequestResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{46} -} - -func (x *PostVpnRequestResponseDto) GetAccessToken() string { - if x != nil { - return x.AccessToken - } - return "" -} - -func (x *PostVpnRequestResponseDto) GetExpiry() *Timestamp { - if x != nil { - return x.Expiry - } - return nil -} - -type PutAppVersionBuildAndDeployResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutAppVersionBuildAndDeployResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutAppVersionBuildAndDeployResponse) Reset() { - *x = PutAppVersionBuildAndDeployResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutAppVersionBuildAndDeployResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutAppVersionBuildAndDeployResponse) ProtoMessage() {} - -func (x *PutAppVersionBuildAndDeployResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutAppVersionBuildAndDeployResponse.ProtoReflect.Descriptor instead. -func (*PutAppVersionBuildAndDeployResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{47} -} - -func (x *PutAppVersionBuildAndDeployResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponse) GetOutput() *PutAppVersionBuildAndDeployResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutAppVersionBuildAndDeployResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,14,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,15,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,4,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,5,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,16,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,6,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,7,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,8,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,10,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,11,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,17,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,18,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,12,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,13,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutAppVersionBuildAndDeployResponseDto) Reset() { - *x = PutAppVersionBuildAndDeployResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutAppVersionBuildAndDeployResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutAppVersionBuildAndDeployResponseDto) ProtoMessage() {} - -func (x *PutAppVersionBuildAndDeployResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutAppVersionBuildAndDeployResponseDto.ProtoReflect.Descriptor instead. -func (*PutAppVersionBuildAndDeployResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{48} -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutAppVersionBuildAndDeployResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type PutAppVersionDeployResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutAppVersionDeployResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutAppVersionDeployResponse) Reset() { - *x = PutAppVersionDeployResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutAppVersionDeployResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutAppVersionDeployResponse) ProtoMessage() {} - -func (x *PutAppVersionDeployResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutAppVersionDeployResponse.ProtoReflect.Descriptor instead. -func (*PutAppVersionDeployResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{49} -} - -func (x *PutAppVersionDeployResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutAppVersionDeployResponse) GetOutput() *PutAppVersionDeployResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutAppVersionDeployResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,14,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,15,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,4,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,5,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,16,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,6,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,7,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,8,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,10,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,11,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,17,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,18,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,12,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,13,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutAppVersionDeployResponseDto) Reset() { - *x = PutAppVersionDeployResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutAppVersionDeployResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutAppVersionDeployResponseDto) ProtoMessage() {} - -func (x *PutAppVersionDeployResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutAppVersionDeployResponseDto.ProtoReflect.Descriptor instead. -func (*PutAppVersionDeployResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{50} -} - -func (x *PutAppVersionDeployResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutAppVersionDeployResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutAppVersionDeployResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutAppVersionDeployResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutAppVersionDeployResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutAppVersionDeployResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutAppVersionDeployResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutAppVersionDeployResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutAppVersionDeployResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type PutProjectStartResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutProjectStartResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutProjectStartResponse) Reset() { - *x = PutProjectStartResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutProjectStartResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutProjectStartResponse) ProtoMessage() {} - -func (x *PutProjectStartResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutProjectStartResponse.ProtoReflect.Descriptor instead. -func (*PutProjectStartResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{51} -} - -func (x *PutProjectStartResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutProjectStartResponse) GetOutput() *PutProjectStartResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutProjectStartResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutProjectStartResponseDto) Reset() { - *x = PutProjectStartResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutProjectStartResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutProjectStartResponseDto) ProtoMessage() {} - -func (x *PutProjectStartResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutProjectStartResponseDto.ProtoReflect.Descriptor instead. -func (*PutProjectStartResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{52} -} - -func (x *PutProjectStartResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutProjectStartResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutProjectStartResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutProjectStartResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutProjectStartResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutProjectStartResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutProjectStartResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutProjectStartResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutProjectStartResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutProjectStartResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutProjectStartResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutProjectStartResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutProjectStartResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutProjectStartResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutProjectStartResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutProjectStartResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutProjectStartResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type PutProjectStopResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutProjectStopResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutProjectStopResponse) Reset() { - *x = PutProjectStopResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutProjectStopResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutProjectStopResponse) ProtoMessage() {} - -func (x *PutProjectStopResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutProjectStopResponse.ProtoReflect.Descriptor instead. -func (*PutProjectStopResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{53} -} - -func (x *PutProjectStopResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutProjectStopResponse) GetOutput() *PutProjectStopResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutProjectStopResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutProjectStopResponseDto) Reset() { - *x = PutProjectStopResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutProjectStopResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutProjectStopResponseDto) ProtoMessage() {} - -func (x *PutProjectStopResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutProjectStopResponseDto.ProtoReflect.Descriptor instead. -func (*PutProjectStopResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{54} -} - -func (x *PutProjectStopResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutProjectStopResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutProjectStopResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutProjectStopResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutProjectStopResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutProjectStopResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutProjectStopResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutProjectStopResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutProjectStopResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutProjectStopResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutProjectStopResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutProjectStopResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutProjectStopResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutProjectStopResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutProjectStopResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutProjectStopResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutProjectStopResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type PutServiceStackRestartResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutServiceStackRestartResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutServiceStackRestartResponse) Reset() { - *x = PutServiceStackRestartResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackRestartResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackRestartResponse) ProtoMessage() {} - -func (x *PutServiceStackRestartResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackRestartResponse.ProtoReflect.Descriptor instead. -func (*PutServiceStackRestartResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{55} -} - -func (x *PutServiceStackRestartResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutServiceStackRestartResponse) GetOutput() *PutServiceStackRestartResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutServiceStackRestartResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutServiceStackRestartResponseDto) Reset() { - *x = PutServiceStackRestartResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackRestartResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackRestartResponseDto) ProtoMessage() {} - -func (x *PutServiceStackRestartResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackRestartResponseDto.ProtoReflect.Descriptor instead. -func (*PutServiceStackRestartResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{56} -} - -func (x *PutServiceStackRestartResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutServiceStackRestartResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutServiceStackRestartResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutServiceStackRestartResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutServiceStackRestartResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutServiceStackRestartResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutServiceStackRestartResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutServiceStackRestartResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutServiceStackRestartResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type PutServiceStackStartResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutServiceStackStartResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutServiceStackStartResponse) Reset() { - *x = PutServiceStackStartResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackStartResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackStartResponse) ProtoMessage() {} - -func (x *PutServiceStackStartResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackStartResponse.ProtoReflect.Descriptor instead. -func (*PutServiceStackStartResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{57} -} - -func (x *PutServiceStackStartResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutServiceStackStartResponse) GetOutput() *PutServiceStackStartResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutServiceStackStartResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutServiceStackStartResponseDto) Reset() { - *x = PutServiceStackStartResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackStartResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackStartResponseDto) ProtoMessage() {} - -func (x *PutServiceStackStartResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackStartResponseDto.ProtoReflect.Descriptor instead. -func (*PutServiceStackStartResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{58} -} - -func (x *PutServiceStackStartResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutServiceStackStartResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutServiceStackStartResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutServiceStackStartResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutServiceStackStartResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutServiceStackStartResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutServiceStackStartResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutServiceStackStartResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutServiceStackStartResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type PutServiceStackStopResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error *Error `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Output *PutServiceStackStopResponseDto `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"` -} - -func (x *PutServiceStackStopResponse) Reset() { - *x = PutServiceStackStopResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackStopResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackStopResponse) ProtoMessage() {} - -func (x *PutServiceStackStopResponse) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackStopResponse.ProtoReflect.Descriptor instead. -func (*PutServiceStackStopResponse) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{59} -} - -func (x *PutServiceStackStopResponse) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *PutServiceStackStopResponse) GetOutput() *PutServiceStackStopResponseDto { - if x != nil { - return x.Output - } - return nil -} - -type PutServiceStackStopResponseDto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *PutServiceStackStopResponseDto) Reset() { - *x = PutServiceStackStopResponseDto{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PutServiceStackStopResponseDto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PutServiceStackStopResponseDto) ProtoMessage() {} - -func (x *PutServiceStackStopResponseDto) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PutServiceStackStopResponseDto.ProtoReflect.Descriptor instead. -func (*PutServiceStackStopResponseDto) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{60} -} - -func (x *PutServiceStackStopResponseDto) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PutServiceStackStopResponseDto) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *PutServiceStackStopResponseDto) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *PutServiceStackStopResponseDto) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *PutServiceStackStopResponseDto) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PutServiceStackStopResponseDto) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *PutServiceStackStopResponseDto) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *PutServiceStackStopResponseDto) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *PutServiceStackStopResponseDto) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type AppVersionBuild struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ServiceStackId *StringNull `protobuf:"bytes,1,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - ServiceStackName *StringNull `protobuf:"bytes,2,opt,name=serviceStackName,proto3" json:"serviceStackName,omitempty"` - ServiceStackTypeVersionId *StringNull `protobuf:"bytes,3,opt,name=serviceStackTypeVersionId,proto3" json:"serviceStackTypeVersionId,omitempty"` - PipelineStart *TimestampNull `protobuf:"bytes,10,opt,name=pipelineStart,proto3" json:"pipelineStart,omitempty"` - PipelineFinish *TimestampNull `protobuf:"bytes,11,opt,name=pipelineFinish,proto3" json:"pipelineFinish,omitempty"` - PipelineFailed *TimestampNull `protobuf:"bytes,12,opt,name=pipelineFailed,proto3" json:"pipelineFailed,omitempty"` - ContainerCreationStart *TimestampNull `protobuf:"bytes,9,opt,name=containerCreationStart,proto3" json:"containerCreationStart,omitempty"` - StartDate *TimestampNull `protobuf:"bytes,4,opt,name=startDate,proto3" json:"startDate,omitempty"` - EndDate *TimestampNull `protobuf:"bytes,5,opt,name=endDate,proto3" json:"endDate,omitempty"` - CacheUsed bool `protobuf:"varint,6,opt,name=cacheUsed,proto3" json:"cacheUsed,omitempty"` - HasCurrentCache bool `protobuf:"varint,7,opt,name=hasCurrentCache,proto3" json:"hasCurrentCache,omitempty"` -} - -func (x *AppVersionBuild) Reset() { - *x = AppVersionBuild{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionBuild) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionBuild) ProtoMessage() {} - -func (x *AppVersionBuild) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionBuild.ProtoReflect.Descriptor instead. -func (*AppVersionBuild) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{61} -} - -func (x *AppVersionBuild) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *AppVersionBuild) GetServiceStackName() *StringNull { - if x != nil { - return x.ServiceStackName - } - return nil -} - -func (x *AppVersionBuild) GetServiceStackTypeVersionId() *StringNull { - if x != nil { - return x.ServiceStackTypeVersionId - } - return nil -} - -func (x *AppVersionBuild) GetPipelineStart() *TimestampNull { - if x != nil { - return x.PipelineStart - } - return nil -} - -func (x *AppVersionBuild) GetPipelineFinish() *TimestampNull { - if x != nil { - return x.PipelineFinish - } - return nil -} - -func (x *AppVersionBuild) GetPipelineFailed() *TimestampNull { - if x != nil { - return x.PipelineFailed - } - return nil -} - -func (x *AppVersionBuild) GetContainerCreationStart() *TimestampNull { - if x != nil { - return x.ContainerCreationStart - } - return nil -} - -func (x *AppVersionBuild) GetStartDate() *TimestampNull { - if x != nil { - return x.StartDate - } - return nil -} - -func (x *AppVersionBuild) GetEndDate() *TimestampNull { - if x != nil { - return x.EndDate - } - return nil -} - -func (x *AppVersionBuild) GetCacheUsed() bool { - if x != nil { - return x.CacheUsed - } - return false -} - -func (x *AppVersionBuild) GetHasCurrentCache() bool { - if x != nil { - return x.HasCurrentCache - } - return false -} - -type AppVersionGithubIntegration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EventType AppVersionGithubIntegrationEventType `protobuf:"varint,1,opt,name=eventType,proto3,enum=zBusinessZeropsApiProtocol.AppVersionGithubIntegrationEventType" json:"eventType,omitempty"` - BranchName *StringNull `protobuf:"bytes,2,opt,name=branchName,proto3" json:"branchName,omitempty"` - Pusher string `protobuf:"bytes,3,opt,name=pusher,proto3" json:"pusher,omitempty"` - Commit string `protobuf:"bytes,4,opt,name=commit,proto3" json:"commit,omitempty"` - RepositoryFullName string `protobuf:"bytes,5,opt,name=repositoryFullName,proto3" json:"repositoryFullName,omitempty"` - TagName *StringNull `protobuf:"bytes,6,opt,name=tagName,proto3" json:"tagName,omitempty"` -} - -func (x *AppVersionGithubIntegration) Reset() { - *x = AppVersionGithubIntegration{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionGithubIntegration) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionGithubIntegration) ProtoMessage() {} - -func (x *AppVersionGithubIntegration) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionGithubIntegration.ProtoReflect.Descriptor instead. -func (*AppVersionGithubIntegration) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{62} -} - -func (x *AppVersionGithubIntegration) GetEventType() AppVersionGithubIntegrationEventType { - if x != nil { - return x.EventType - } - return AppVersionGithubIntegrationEventType_APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN -} - -func (x *AppVersionGithubIntegration) GetBranchName() *StringNull { - if x != nil { - return x.BranchName - } - return nil -} - -func (x *AppVersionGithubIntegration) GetPusher() string { - if x != nil { - return x.Pusher - } - return "" -} - -func (x *AppVersionGithubIntegration) GetCommit() string { - if x != nil { - return x.Commit - } - return "" -} - -func (x *AppVersionGithubIntegration) GetRepositoryFullName() string { - if x != nil { - return x.RepositoryFullName - } - return "" -} - -func (x *AppVersionGithubIntegration) GetTagName() *StringNull { - if x != nil { - return x.TagName - } - return nil -} - -type AppVersionGitlabIntegration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EventType AppVersionGitlabIntegrationEventType `protobuf:"varint,1,opt,name=eventType,proto3,enum=zBusinessZeropsApiProtocol.AppVersionGitlabIntegrationEventType" json:"eventType,omitempty"` - BranchName *StringNull `protobuf:"bytes,2,opt,name=branchName,proto3" json:"branchName,omitempty"` - Pusher string `protobuf:"bytes,3,opt,name=pusher,proto3" json:"pusher,omitempty"` - Commit string `protobuf:"bytes,4,opt,name=commit,proto3" json:"commit,omitempty"` - RepositoryFullName string `protobuf:"bytes,5,opt,name=repositoryFullName,proto3" json:"repositoryFullName,omitempty"` - TagName *StringNull `protobuf:"bytes,6,opt,name=tagName,proto3" json:"tagName,omitempty"` -} - -func (x *AppVersionGitlabIntegration) Reset() { - *x = AppVersionGitlabIntegration{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionGitlabIntegration) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionGitlabIntegration) ProtoMessage() {} - -func (x *AppVersionGitlabIntegration) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionGitlabIntegration.ProtoReflect.Descriptor instead. -func (*AppVersionGitlabIntegration) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{63} -} - -func (x *AppVersionGitlabIntegration) GetEventType() AppVersionGitlabIntegrationEventType { - if x != nil { - return x.EventType - } - return AppVersionGitlabIntegrationEventType_APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN -} - -func (x *AppVersionGitlabIntegration) GetBranchName() *StringNull { - if x != nil { - return x.BranchName - } - return nil -} - -func (x *AppVersionGitlabIntegration) GetPusher() string { - if x != nil { - return x.Pusher - } - return "" -} - -func (x *AppVersionGitlabIntegration) GetCommit() string { - if x != nil { - return x.Commit - } - return "" -} - -func (x *AppVersionGitlabIntegration) GetRepositoryFullName() string { - if x != nil { - return x.RepositoryFullName - } - return "" -} - -func (x *AppVersionGitlabIntegration) GetTagName() *StringNull { - if x != nil { - return x.TagName - } - return nil -} - -type AppVersionJsonObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,15,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - ProjectId *StringNull `protobuf:"bytes,16,opt,name=projectId,proto3" json:"projectId,omitempty"` - Status AppVersionStatus `protobuf:"varint,9,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.AppVersionStatus" json:"status,omitempty"` - Source AppVersionSource `protobuf:"varint,2,opt,name=source,proto3,enum=zBusinessZeropsApiProtocol.AppVersionSource" json:"source,omitempty"` - Sequence int32 `protobuf:"varint,3,opt,name=sequence,proto3" json:"sequence,omitempty"` - Name *StringNull `protobuf:"bytes,10,opt,name=name,proto3" json:"name,omitempty"` - Created *TimestampNull `protobuf:"bytes,11,opt,name=created,proto3" json:"created,omitempty"` - Build *AppVersionBuildNull `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - PrepareCustomRuntime *PrepareCustomRuntimeNull `protobuf:"bytes,13,opt,name=prepareCustomRuntime,proto3" json:"prepareCustomRuntime,omitempty"` - GithubIntegration *AppVersionGithubIntegrationNull `protobuf:"bytes,5,opt,name=githubIntegration,proto3" json:"githubIntegration,omitempty"` - GitlabIntegration *AppVersionGitlabIntegrationNull `protobuf:"bytes,6,opt,name=gitlabIntegration,proto3" json:"gitlabIntegration,omitempty"` - CreatedByUser *UserJsonObjectNull `protobuf:"bytes,7,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - ActivationDate *TimestampNull `protobuf:"bytes,8,opt,name=activationDate,proto3" json:"activationDate,omitempty"` - PublicGitSource *AppVersionPublicGitSourceNull `protobuf:"bytes,12,opt,name=publicGitSource,proto3" json:"publicGitSource,omitempty"` - ConfigContent *StringNull `protobuf:"bytes,14,opt,name=configContent,proto3" json:"configContent,omitempty"` -} - -func (x *AppVersionJsonObject) Reset() { - *x = AppVersionJsonObject{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionJsonObject) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionJsonObject) ProtoMessage() {} - -func (x *AppVersionJsonObject) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionJsonObject.ProtoReflect.Descriptor instead. -func (*AppVersionJsonObject) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{64} -} - -func (x *AppVersionJsonObject) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *AppVersionJsonObject) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *AppVersionJsonObject) GetProjectId() *StringNull { - if x != nil { - return x.ProjectId - } - return nil -} - -func (x *AppVersionJsonObject) GetStatus() AppVersionStatus { - if x != nil { - return x.Status - } - return AppVersionStatus_APP_VERSION_STATUS_UNKNOWN -} - -func (x *AppVersionJsonObject) GetSource() AppVersionSource { - if x != nil { - return x.Source - } - return AppVersionSource_APP_VERSION_SOURCE_UNKNOWN -} - -func (x *AppVersionJsonObject) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *AppVersionJsonObject) GetName() *StringNull { - if x != nil { - return x.Name - } - return nil -} - -func (x *AppVersionJsonObject) GetCreated() *TimestampNull { - if x != nil { - return x.Created - } - return nil -} - -func (x *AppVersionJsonObject) GetBuild() *AppVersionBuildNull { - if x != nil { - return x.Build - } - return nil -} - -func (x *AppVersionJsonObject) GetPrepareCustomRuntime() *PrepareCustomRuntimeNull { - if x != nil { - return x.PrepareCustomRuntime - } - return nil -} - -func (x *AppVersionJsonObject) GetGithubIntegration() *AppVersionGithubIntegrationNull { - if x != nil { - return x.GithubIntegration - } - return nil -} - -func (x *AppVersionJsonObject) GetGitlabIntegration() *AppVersionGitlabIntegrationNull { - if x != nil { - return x.GitlabIntegration - } - return nil -} - -func (x *AppVersionJsonObject) GetCreatedByUser() *UserJsonObjectNull { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *AppVersionJsonObject) GetActivationDate() *TimestampNull { - if x != nil { - return x.ActivationDate - } - return nil -} - -func (x *AppVersionJsonObject) GetPublicGitSource() *AppVersionPublicGitSourceNull { - if x != nil { - return x.PublicGitSource - } - return nil -} - -func (x *AppVersionJsonObject) GetConfigContent() *StringNull { - if x != nil { - return x.ConfigContent - } - return nil -} - -type AppVersionLight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Status AppVersionStatus `protobuf:"varint,2,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.AppVersionStatus" json:"status,omitempty"` - Created *Timestamp `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,4,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` -} - -func (x *AppVersionLight) Reset() { - *x = AppVersionLight{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionLight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionLight) ProtoMessage() {} - -func (x *AppVersionLight) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionLight.ProtoReflect.Descriptor instead. -func (*AppVersionLight) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{65} -} - -func (x *AppVersionLight) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *AppVersionLight) GetStatus() AppVersionStatus { - if x != nil { - return x.Status - } - return AppVersionStatus_APP_VERSION_STATUS_UNKNOWN -} - -func (x *AppVersionLight) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *AppVersionLight) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -type AppVersionPublicGitSource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GitUrl string `protobuf:"bytes,1,opt,name=gitUrl,proto3" json:"gitUrl,omitempty"` - BranchName string `protobuf:"bytes,2,opt,name=branchName,proto3" json:"branchName,omitempty"` -} - -func (x *AppVersionPublicGitSource) Reset() { - *x = AppVersionPublicGitSource{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionPublicGitSource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionPublicGitSource) ProtoMessage() {} - -func (x *AppVersionPublicGitSource) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionPublicGitSource.ProtoReflect.Descriptor instead. -func (*AppVersionPublicGitSource) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{66} -} - -func (x *AppVersionPublicGitSource) GetGitUrl() string { - if x != nil { - return x.GitUrl - } - return "" -} - -func (x *AppVersionPublicGitSource) GetBranchName() string { - if x != nil { - return x.BranchName - } - return "" -} - -type AppVersionUserData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - Type UserDataType `protobuf:"varint,3,opt,name=type,proto3,enum=zBusinessZeropsApiProtocol.UserDataType" json:"type,omitempty"` -} - -func (x *AppVersionUserData) Reset() { - *x = AppVersionUserData{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionUserData) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionUserData) ProtoMessage() {} - -func (x *AppVersionUserData) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionUserData.ProtoReflect.Descriptor instead. -func (*AppVersionUserData) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{67} -} - -func (x *AppVersionUserData) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *AppVersionUserData) GetContent() string { - if x != nil { - return x.Content - } - return "" -} - -func (x *AppVersionUserData) GetType() UserDataType { - if x != nil { - return x.Type - } - return UserDataType_USER_DATA_TYPE_UNKNOWN -} - -type ClientAvatar struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LargeAvatarUrl *StringNull `protobuf:"bytes,1,opt,name=largeAvatarUrl,proto3" json:"largeAvatarUrl,omitempty"` - SmallAvatarUrl *StringNull `protobuf:"bytes,2,opt,name=smallAvatarUrl,proto3" json:"smallAvatarUrl,omitempty"` - ExternalAvatarUrl *StringNull `protobuf:"bytes,3,opt,name=externalAvatarUrl,proto3" json:"externalAvatarUrl,omitempty"` -} - -func (x *ClientAvatar) Reset() { - *x = ClientAvatar{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientAvatar) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientAvatar) ProtoMessage() {} - -func (x *ClientAvatar) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientAvatar.ProtoReflect.Descriptor instead. -func (*ClientAvatar) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{68} -} - -func (x *ClientAvatar) GetLargeAvatarUrl() *StringNull { - if x != nil { - return x.LargeAvatarUrl - } - return nil -} - -func (x *ClientAvatar) GetSmallAvatarUrl() *StringNull { - if x != nil { - return x.SmallAvatarUrl - } - return nil -} - -func (x *ClientAvatar) GetExternalAvatarUrl() *StringNull { - if x != nil { - return x.ExternalAvatarUrl - } - return nil -} - -type ClientExtra struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CompanyName string `protobuf:"bytes,2,opt,name=companyName,proto3" json:"companyName,omitempty"` - CompanyNumber *StringNull `protobuf:"bytes,3,opt,name=companyNumber,proto3" json:"companyNumber,omitempty"` - VatNumber *StringNull `protobuf:"bytes,4,opt,name=vatNumber,proto3" json:"vatNumber,omitempty"` - Avatar *ClientAvatarNull `protobuf:"bytes,5,opt,name=avatar,proto3" json:"avatar,omitempty"` - AccountName string `protobuf:"bytes,6,opt,name=accountName,proto3" json:"accountName,omitempty"` -} - -func (x *ClientExtra) Reset() { - *x = ClientExtra{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientExtra) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientExtra) ProtoMessage() {} - -func (x *ClientExtra) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientExtra.ProtoReflect.Descriptor instead. -func (*ClientExtra) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{69} -} - -func (x *ClientExtra) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ClientExtra) GetCompanyName() string { - if x != nil { - return x.CompanyName - } - return "" -} - -func (x *ClientExtra) GetCompanyNumber() *StringNull { - if x != nil { - return x.CompanyNumber - } - return nil -} - -func (x *ClientExtra) GetVatNumber() *StringNull { - if x != nil { - return x.VatNumber - } - return nil -} - -func (x *ClientExtra) GetAvatar() *ClientAvatarNull { - if x != nil { - return x.Avatar - } - return nil -} - -func (x *ClientExtra) GetAccountName() string { - if x != nil { - return x.AccountName - } - return "" -} - -type ClientUserExtra struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - UserId string `protobuf:"bytes,3,opt,name=userId,proto3" json:"userId,omitempty"` - Status ClientUserLightStatus `protobuf:"varint,4,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ClientUserLightStatus" json:"status,omitempty"` - RoleCode ClientUserLightRoleCode `protobuf:"varint,5,opt,name=roleCode,proto3,enum=zBusinessZeropsApiProtocol.ClientUserLightRoleCode" json:"roleCode,omitempty"` - Client *ClientExtra `protobuf:"bytes,6,opt,name=client,proto3" json:"client,omitempty"` - User *UserLight `protobuf:"bytes,7,opt,name=user,proto3" json:"user,omitempty"` -} - -func (x *ClientUserExtra) Reset() { - *x = ClientUserExtra{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientUserExtra) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientUserExtra) ProtoMessage() {} - -func (x *ClientUserExtra) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientUserExtra.ProtoReflect.Descriptor instead. -func (*ClientUserExtra) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{70} -} - -func (x *ClientUserExtra) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ClientUserExtra) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *ClientUserExtra) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *ClientUserExtra) GetStatus() ClientUserLightStatus { - if x != nil { - return x.Status - } - return ClientUserLightStatus_CLIENT_USER_LIGHT_STATUS_UNKNOWN -} - -func (x *ClientUserExtra) GetRoleCode() ClientUserLightRoleCode { - if x != nil { - return x.RoleCode - } - return ClientUserLightRoleCode_CLIENT_USER_LIGHT_ROLE_CODE_UNKNOWN -} - -func (x *ClientUserExtra) GetClient() *ClientExtra { - if x != nil { - return x.Client - } - return nil -} - -func (x *ClientUserExtra) GetUser() *UserLight { - if x != nil { - return x.User - } - return nil -} - -type CustomAutoscaling struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VerticalAutoscaling *VerticalAutoscalingNull `protobuf:"bytes,1,opt,name=verticalAutoscaling,proto3" json:"verticalAutoscaling,omitempty"` - HorizontalAutoscaling *HorizontalAutoscalingNull `protobuf:"bytes,2,opt,name=horizontalAutoscaling,proto3" json:"horizontalAutoscaling,omitempty"` -} - -func (x *CustomAutoscaling) Reset() { - *x = CustomAutoscaling{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CustomAutoscaling) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CustomAutoscaling) ProtoMessage() {} - -func (x *CustomAutoscaling) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CustomAutoscaling.ProtoReflect.Descriptor instead. -func (*CustomAutoscaling) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{71} -} - -func (x *CustomAutoscaling) GetVerticalAutoscaling() *VerticalAutoscalingNull { - if x != nil { - return x.VerticalAutoscaling - } - return nil -} - -func (x *CustomAutoscaling) GetHorizontalAutoscaling() *HorizontalAutoscalingNull { - if x != nil { - return x.HorizontalAutoscaling - } - return nil -} - -type GithubIntegration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - AuthorizationRequired bool `protobuf:"varint,2,opt,name=authorizationRequired,proto3" json:"authorizationRequired,omitempty"` - BranchName *StringNull `protobuf:"bytes,3,opt,name=branchName,proto3" json:"branchName,omitempty"` - EventType GithubIntegrationEventType `protobuf:"varint,5,opt,name=eventType,proto3,enum=zBusinessZeropsApiProtocol.GithubIntegrationEventType" json:"eventType,omitempty"` - IsActive bool `protobuf:"varint,6,opt,name=isActive,proto3" json:"isActive,omitempty"` - RepositoryFullName string `protobuf:"bytes,7,opt,name=repositoryFullName,proto3" json:"repositoryFullName,omitempty"` - WebhookId *Int32Null `protobuf:"bytes,9,opt,name=webhookId,proto3" json:"webhookId,omitempty"` -} - -func (x *GithubIntegration) Reset() { - *x = GithubIntegration{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GithubIntegration) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GithubIntegration) ProtoMessage() {} - -func (x *GithubIntegration) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GithubIntegration.ProtoReflect.Descriptor instead. -func (*GithubIntegration) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{72} -} - -func (x *GithubIntegration) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *GithubIntegration) GetAuthorizationRequired() bool { - if x != nil { - return x.AuthorizationRequired - } - return false -} - -func (x *GithubIntegration) GetBranchName() *StringNull { - if x != nil { - return x.BranchName - } - return nil -} - -func (x *GithubIntegration) GetEventType() GithubIntegrationEventType { - if x != nil { - return x.EventType - } - return GithubIntegrationEventType_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN -} - -func (x *GithubIntegration) GetIsActive() bool { - if x != nil { - return x.IsActive - } - return false -} - -func (x *GithubIntegration) GetRepositoryFullName() string { - if x != nil { - return x.RepositoryFullName - } - return "" -} - -func (x *GithubIntegration) GetWebhookId() *Int32Null { - if x != nil { - return x.WebhookId - } - return nil -} - -type GitlabIntegration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - AuthorizationRequired bool `protobuf:"varint,2,opt,name=authorizationRequired,proto3" json:"authorizationRequired,omitempty"` - BranchName *StringNull `protobuf:"bytes,3,opt,name=branchName,proto3" json:"branchName,omitempty"` - EventType GitlabIntegrationEventType `protobuf:"varint,4,opt,name=eventType,proto3,enum=zBusinessZeropsApiProtocol.GitlabIntegrationEventType" json:"eventType,omitempty"` - IsActive bool `protobuf:"varint,5,opt,name=isActive,proto3" json:"isActive,omitempty"` - RepositoryFullName string `protobuf:"bytes,6,opt,name=repositoryFullName,proto3" json:"repositoryFullName,omitempty"` - WebhookId *Int32Null `protobuf:"bytes,7,opt,name=webhookId,proto3" json:"webhookId,omitempty"` -} - -func (x *GitlabIntegration) Reset() { - *x = GitlabIntegration{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GitlabIntegration) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GitlabIntegration) ProtoMessage() {} - -func (x *GitlabIntegration) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[73] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GitlabIntegration.ProtoReflect.Descriptor instead. -func (*GitlabIntegration) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{73} -} - -func (x *GitlabIntegration) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *GitlabIntegration) GetAuthorizationRequired() bool { - if x != nil { - return x.AuthorizationRequired - } - return false -} - -func (x *GitlabIntegration) GetBranchName() *StringNull { - if x != nil { - return x.BranchName - } - return nil -} - -func (x *GitlabIntegration) GetEventType() GitlabIntegrationEventType { - if x != nil { - return x.EventType - } - return GitlabIntegrationEventType_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN -} - -func (x *GitlabIntegration) GetIsActive() bool { - if x != nil { - return x.IsActive - } - return false -} - -func (x *GitlabIntegration) GetRepositoryFullName() string { - if x != nil { - return x.RepositoryFullName - } - return "" -} - -func (x *GitlabIntegration) GetWebhookId() *Int32Null { - if x != nil { - return x.WebhookId - } - return nil -} - -type HorizontalAutoscaling struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - MaxContainerCount int32 `protobuf:"varint,1,opt,name=maxContainerCount,proto3" json:"maxContainerCount,omitempty"` - MinContainerCount int32 `protobuf:"varint,2,opt,name=minContainerCount,proto3" json:"minContainerCount,omitempty"` -} - -func (x *HorizontalAutoscaling) Reset() { - *x = HorizontalAutoscaling{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HorizontalAutoscaling) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HorizontalAutoscaling) ProtoMessage() {} - -func (x *HorizontalAutoscaling) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[74] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HorizontalAutoscaling.ProtoReflect.Descriptor instead. -func (*HorizontalAutoscaling) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{74} -} - -func (x *HorizontalAutoscaling) GetMaxContainerCount() int32 { - if x != nil { - return x.MaxContainerCount - } - return 0 -} - -func (x *HorizontalAutoscaling) GetMinContainerCount() int32 { - if x != nil { - return x.MinContainerCount - } - return 0 -} - -type Language struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Language) Reset() { - *x = Language{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Language) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Language) ProtoMessage() {} - -func (x *Language) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[75] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Language.ProtoReflect.Descriptor instead. -func (*Language) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{75} -} - -func (x *Language) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Language) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type LocationServiceStackInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ServiceStackName string `protobuf:"bytes,1,opt,name=serviceStackName,proto3" json:"serviceStackName,omitempty"` - ServiceStackTypeName string `protobuf:"bytes,2,opt,name=serviceStackTypeName,proto3" json:"serviceStackTypeName,omitempty"` - ServiceStackTypeVersionName string `protobuf:"bytes,3,opt,name=serviceStackTypeVersionName,proto3" json:"serviceStackTypeVersionName,omitempty"` -} - -func (x *LocationServiceStackInfo) Reset() { - *x = LocationServiceStackInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LocationServiceStackInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LocationServiceStackInfo) ProtoMessage() {} - -func (x *LocationServiceStackInfo) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[76] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LocationServiceStackInfo.ProtoReflect.Descriptor instead. -func (*LocationServiceStackInfo) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{76} -} - -func (x *LocationServiceStackInfo) GetServiceStackName() string { - if x != nil { - return x.ServiceStackName - } - return "" -} - -func (x *LocationServiceStackInfo) GetServiceStackTypeName() string { - if x != nil { - return x.ServiceStackTypeName - } - return "" -} - -func (x *LocationServiceStackInfo) GetServiceStackTypeVersionName() string { - if x != nil { - return x.ServiceStackTypeVersionName - } - return "" -} - -type PrepareCustomRuntime struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ContainerCreationStart *TimestampNull `protobuf:"bytes,8,opt,name=containerCreationStart,proto3" json:"containerCreationStart,omitempty"` - StartDate *TimestampNull `protobuf:"bytes,1,opt,name=startDate,proto3" json:"startDate,omitempty"` - EndDate *TimestampNull `protobuf:"bytes,2,opt,name=endDate,proto3" json:"endDate,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,5,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - ServiceStackName *StringNull `protobuf:"bytes,6,opt,name=serviceStackName,proto3" json:"serviceStackName,omitempty"` -} - -func (x *PrepareCustomRuntime) Reset() { - *x = PrepareCustomRuntime{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PrepareCustomRuntime) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PrepareCustomRuntime) ProtoMessage() {} - -func (x *PrepareCustomRuntime) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[77] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PrepareCustomRuntime.ProtoReflect.Descriptor instead. -func (*PrepareCustomRuntime) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{77} -} - -func (x *PrepareCustomRuntime) GetContainerCreationStart() *TimestampNull { - if x != nil { - return x.ContainerCreationStart - } - return nil -} - -func (x *PrepareCustomRuntime) GetStartDate() *TimestampNull { - if x != nil { - return x.StartDate - } - return nil -} - -func (x *PrepareCustomRuntime) GetEndDate() *TimestampNull { - if x != nil { - return x.EndDate - } - return nil -} - -func (x *PrepareCustomRuntime) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *PrepareCustomRuntime) GetServiceStackName() *StringNull { - if x != nil { - return x.ServiceStackName - } - return nil -} - -type Process struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId *StringNull `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Project *ProjectLightJsonObject `protobuf:"bytes,5,opt,name=project,proto3" json:"project,omitempty"` - ServiceStacks []*ServiceStackLightJsonObject `protobuf:"bytes,6,rep,name=serviceStacks,proto3" json:"serviceStacks,omitempty"` - Status ProcessStatus `protobuf:"varint,7,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProcessStatus" json:"status,omitempty"` - Sequence int32 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreatedByUser *UserJsonObject `protobuf:"bytes,9,opt,name=createdByUser,proto3" json:"createdByUser,omitempty"` - CanceledByUser *UserJsonObjectNull `protobuf:"bytes,10,opt,name=canceledByUser,proto3" json:"canceledByUser,omitempty"` - ActionName string `protobuf:"bytes,11,opt,name=actionName,proto3" json:"actionName,omitempty"` - Created *Timestamp `protobuf:"bytes,12,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,13,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - Started *TimestampNull `protobuf:"bytes,14,opt,name=started,proto3" json:"started,omitempty"` - Finished *TimestampNull `protobuf:"bytes,15,opt,name=finished,proto3" json:"finished,omitempty"` - CreatedBySystem bool `protobuf:"varint,16,opt,name=createdBySystem,proto3" json:"createdBySystem,omitempty"` - AppVersion *AppVersionJsonObjectNull `protobuf:"bytes,17,opt,name=appVersion,proto3" json:"appVersion,omitempty"` -} - -func (x *Process) Reset() { - *x = Process{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Process) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Process) ProtoMessage() {} - -func (x *Process) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[78] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Process.ProtoReflect.Descriptor instead. -func (*Process) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{78} -} - -func (x *Process) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Process) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *Process) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *Process) GetServiceStackId() *StringNull { - if x != nil { - return x.ServiceStackId - } - return nil -} - -func (x *Process) GetProject() *ProjectLightJsonObject { - if x != nil { - return x.Project - } - return nil -} - -func (x *Process) GetServiceStacks() []*ServiceStackLightJsonObject { - if x != nil { - return x.ServiceStacks - } - return nil -} - -func (x *Process) GetStatus() ProcessStatus { - if x != nil { - return x.Status - } - return ProcessStatus_PROCESS_STATUS_UNKNOWN -} - -func (x *Process) GetSequence() int32 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *Process) GetCreatedByUser() *UserJsonObject { - if x != nil { - return x.CreatedByUser - } - return nil -} - -func (x *Process) GetCanceledByUser() *UserJsonObjectNull { - if x != nil { - return x.CanceledByUser - } - return nil -} - -func (x *Process) GetActionName() string { - if x != nil { - return x.ActionName - } - return "" -} - -func (x *Process) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *Process) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *Process) GetStarted() *TimestampNull { - if x != nil { - return x.Started - } - return nil -} - -func (x *Process) GetFinished() *TimestampNull { - if x != nil { - return x.Finished - } - return nil -} - -func (x *Process) GetCreatedBySystem() bool { - if x != nil { - return x.CreatedBySystem - } - return false -} - -func (x *Process) GetAppVersion() *AppVersionJsonObjectNull { - if x != nil { - return x.AppVersion - } - return nil -} - -type Project struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description *StringNull `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - TagList []string `protobuf:"bytes,5,rep,name=tagList,proto3" json:"tagList,omitempty"` - Status ProjectStatus `protobuf:"varint,6,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProjectStatus" json:"status,omitempty"` - Created *Timestamp `protobuf:"bytes,7,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,8,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - PublicIpV4 *StringNull `protobuf:"bytes,9,opt,name=publicIpV4,proto3" json:"publicIpV4,omitempty"` - PublicIpV6 *StringNull `protobuf:"bytes,10,opt,name=publicIpV6,proto3" json:"publicIpV6,omitempty"` - ZeropsSubdomainHost *StringNull `protobuf:"bytes,13,opt,name=zeropsSubdomainHost,proto3" json:"zeropsSubdomainHost,omitempty"` - AutoStartup bool `protobuf:"varint,14,opt,name=autoStartup,proto3" json:"autoStartup,omitempty"` -} - -func (x *Project) Reset() { - *x = Project{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Project) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Project) ProtoMessage() {} - -func (x *Project) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[79] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Project.ProtoReflect.Descriptor instead. -func (*Project) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{79} -} - -func (x *Project) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Project) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *Project) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Project) GetDescription() *StringNull { - if x != nil { - return x.Description - } - return nil -} - -func (x *Project) GetTagList() []string { - if x != nil { - return x.TagList - } - return nil -} - -func (x *Project) GetStatus() ProjectStatus { - if x != nil { - return x.Status - } - return ProjectStatus_PROJECT_STATUS_UNKNOWN -} - -func (x *Project) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *Project) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *Project) GetPublicIpV4() *StringNull { - if x != nil { - return x.PublicIpV4 - } - return nil -} - -func (x *Project) GetPublicIpV6() *StringNull { - if x != nil { - return x.PublicIpV6 - } - return nil -} - -func (x *Project) GetZeropsSubdomainHost() *StringNull { - if x != nil { - return x.ZeropsSubdomainHost - } - return nil -} - -func (x *Project) GetAutoStartup() bool { - if x != nil { - return x.AutoStartup - } - return false -} - -type ProjectImportServiceStack struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Error *ErrorNull `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` - Processes []*Process `protobuf:"bytes,4,rep,name=processes,proto3" json:"processes,omitempty"` -} - -func (x *ProjectImportServiceStack) Reset() { - *x = ProjectImportServiceStack{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[80] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProjectImportServiceStack) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProjectImportServiceStack) ProtoMessage() {} - -func (x *ProjectImportServiceStack) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[80] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProjectImportServiceStack.ProtoReflect.Descriptor instead. -func (*ProjectImportServiceStack) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{80} -} - -func (x *ProjectImportServiceStack) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ProjectImportServiceStack) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ProjectImportServiceStack) GetError() *ErrorNull { - if x != nil { - return x.Error - } - return nil -} - -func (x *ProjectImportServiceStack) GetProcesses() []*Process { - if x != nil { - return x.Processes - } - return nil -} - -type ProjectLight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description *StringNull `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - TagList []string `protobuf:"bytes,5,rep,name=tagList,proto3" json:"tagList,omitempty"` - Status ProjectStatus `protobuf:"varint,6,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProjectStatus" json:"status,omitempty"` - Created *Timestamp `protobuf:"bytes,7,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,8,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` -} - -func (x *ProjectLight) Reset() { - *x = ProjectLight{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[81] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProjectLight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProjectLight) ProtoMessage() {} - -func (x *ProjectLight) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[81] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProjectLight.ProtoReflect.Descriptor instead. -func (*ProjectLight) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{81} -} - -func (x *ProjectLight) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ProjectLight) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *ProjectLight) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ProjectLight) GetDescription() *StringNull { - if x != nil { - return x.Description - } - return nil -} - -func (x *ProjectLight) GetTagList() []string { - if x != nil { - return x.TagList - } - return nil -} - -func (x *ProjectLight) GetStatus() ProjectStatus { - if x != nil { - return x.Status - } - return ProjectStatus_PROJECT_STATUS_UNKNOWN -} - -func (x *ProjectLight) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *ProjectLight) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -type ProjectLightJsonObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description *StringNull `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - TagList []string `protobuf:"bytes,5,rep,name=tagList,proto3" json:"tagList,omitempty"` - Status ProjectStatus `protobuf:"varint,6,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ProjectStatus" json:"status,omitempty"` - Created *Timestamp `protobuf:"bytes,7,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,8,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` -} - -func (x *ProjectLightJsonObject) Reset() { - *x = ProjectLightJsonObject{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[82] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ProjectLightJsonObject) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ProjectLightJsonObject) ProtoMessage() {} - -func (x *ProjectLightJsonObject) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[82] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ProjectLightJsonObject.ProtoReflect.Descriptor instead. -func (*ProjectLightJsonObject) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{82} -} - -func (x *ProjectLightJsonObject) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ProjectLightJsonObject) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *ProjectLightJsonObject) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ProjectLightJsonObject) GetDescription() *StringNull { - if x != nil { - return x.Description - } - return nil -} - -func (x *ProjectLightJsonObject) GetTagList() []string { - if x != nil { - return x.TagList - } - return nil -} - -func (x *ProjectLightJsonObject) GetStatus() ProjectStatus { - if x != nil { - return x.Status - } - return ProjectStatus_PROJECT_STATUS_UNKNOWN -} - -func (x *ProjectLightJsonObject) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *ProjectLightJsonObject) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -type PublicHttpRoutingDomain struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DomainName string `protobuf:"bytes,1,opt,name=domainName,proto3" json:"domainName,omitempty"` - DnsCheckStatus PublicHttpRoutingDomainDnsCheckStatus `protobuf:"varint,2,opt,name=dnsCheckStatus,proto3,enum=zBusinessZeropsApiProtocol.PublicHttpRoutingDomainDnsCheckStatus" json:"dnsCheckStatus,omitempty"` - SslStatus PublicHttpRoutingDomainSslStatus `protobuf:"varint,3,opt,name=sslStatus,proto3,enum=zBusinessZeropsApiProtocol.PublicHttpRoutingDomainSslStatus" json:"sslStatus,omitempty"` -} - -func (x *PublicHttpRoutingDomain) Reset() { - *x = PublicHttpRoutingDomain{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[83] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PublicHttpRoutingDomain) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PublicHttpRoutingDomain) ProtoMessage() {} - -func (x *PublicHttpRoutingDomain) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[83] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PublicHttpRoutingDomain.ProtoReflect.Descriptor instead. -func (*PublicHttpRoutingDomain) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{83} -} - -func (x *PublicHttpRoutingDomain) GetDomainName() string { - if x != nil { - return x.DomainName - } - return "" -} - -func (x *PublicHttpRoutingDomain) GetDnsCheckStatus() PublicHttpRoutingDomainDnsCheckStatus { - if x != nil { - return x.DnsCheckStatus - } - return PublicHttpRoutingDomainDnsCheckStatus_PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_UNKNOWN -} - -func (x *PublicHttpRoutingDomain) GetSslStatus() PublicHttpRoutingDomainSslStatus { - if x != nil { - return x.SslStatus - } - return PublicHttpRoutingDomainSslStatus_PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_UNKNOWN -} - -type PublicHttpRoutingLocation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` - ServiceStackId string `protobuf:"bytes,3,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - ServiceStackInfo *LocationServiceStackInfo `protobuf:"bytes,4,opt,name=serviceStackInfo,proto3" json:"serviceStackInfo,omitempty"` -} - -func (x *PublicHttpRoutingLocation) Reset() { - *x = PublicHttpRoutingLocation{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[84] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PublicHttpRoutingLocation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PublicHttpRoutingLocation) ProtoMessage() {} - -func (x *PublicHttpRoutingLocation) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[84] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PublicHttpRoutingLocation.ProtoReflect.Descriptor instead. -func (*PublicHttpRoutingLocation) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{84} -} - -func (x *PublicHttpRoutingLocation) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *PublicHttpRoutingLocation) GetPort() int32 { - if x != nil { - return x.Port - } - return 0 -} - -func (x *PublicHttpRoutingLocation) GetServiceStackId() string { - if x != nil { - return x.ServiceStackId - } - return "" -} - -func (x *PublicHttpRoutingLocation) GetServiceStackInfo() *LocationServiceStackInfo { - if x != nil { - return x.ServiceStackInfo - } - return nil -} - -type RequestedPortsJsonObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IsActive bool `protobuf:"varint,1,opt,name=isActive,proto3" json:"isActive,omitempty"` - RequestedPorts []*ServicePort `protobuf:"bytes,2,rep,name=requestedPorts,proto3" json:"requestedPorts,omitempty"` -} - -func (x *RequestedPortsJsonObject) Reset() { - *x = RequestedPortsJsonObject{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[85] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RequestedPortsJsonObject) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RequestedPortsJsonObject) ProtoMessage() {} - -func (x *RequestedPortsJsonObject) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[85] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RequestedPortsJsonObject.ProtoReflect.Descriptor instead. -func (*RequestedPortsJsonObject) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{85} -} - -func (x *RequestedPortsJsonObject) GetIsActive() bool { - if x != nil { - return x.IsActive - } - return false -} - -func (x *RequestedPortsJsonObject) GetRequestedPorts() []*ServicePort { - if x != nil { - return x.RequestedPorts - } - return nil -} - -type ScalingResource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CpuCoreCount int32 `protobuf:"varint,1,opt,name=cpuCoreCount,proto3" json:"cpuCoreCount,omitempty"` - MemoryGBytes float32 `protobuf:"fixed32,2,opt,name=memoryGBytes,proto3" json:"memoryGBytes,omitempty"` - DiskGBytes float32 `protobuf:"fixed32,3,opt,name=diskGBytes,proto3" json:"diskGBytes,omitempty"` -} - -func (x *ScalingResource) Reset() { - *x = ScalingResource{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[86] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ScalingResource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ScalingResource) ProtoMessage() {} - -func (x *ScalingResource) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[86] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ScalingResource.ProtoReflect.Descriptor instead. -func (*ScalingResource) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{86} -} - -func (x *ScalingResource) GetCpuCoreCount() int32 { - if x != nil { - return x.CpuCoreCount - } - return 0 -} - -func (x *ScalingResource) GetMemoryGBytes() float32 { - if x != nil { - return x.MemoryGBytes - } - return 0 -} - -func (x *ScalingResource) GetDiskGBytes() float32 { - if x != nil { - return x.DiskGBytes - } - return 0 -} - -type ServicePort struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Protocol ServicePortProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=zBusinessZeropsApiProtocol.ServicePortProtocol" json:"protocol,omitempty"` - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Scheme ServicePortScheme `protobuf:"varint,4,opt,name=scheme,proto3,enum=zBusinessZeropsApiProtocol.ServicePortScheme" json:"scheme,omitempty"` - ServiceId *StringNull `protobuf:"bytes,5,opt,name=serviceId,proto3" json:"serviceId,omitempty"` -} - -func (x *ServicePort) Reset() { - *x = ServicePort{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[87] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServicePort) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServicePort) ProtoMessage() {} - -func (x *ServicePort) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[87] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServicePort.ProtoReflect.Descriptor instead. -func (*ServicePort) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{87} -} - -func (x *ServicePort) GetProtocol() ServicePortProtocol { - if x != nil { - return x.Protocol - } - return ServicePortProtocol_SERVICE_PORT_PROTOCOL_UNKNOWN -} - -func (x *ServicePort) GetPort() int32 { - if x != nil { - return x.Port - } - return 0 -} - -func (x *ServicePort) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *ServicePort) GetScheme() ServicePortScheme { - if x != nil { - return x.Scheme - } - return ServicePortScheme_SERVICE_PORT_SCHEME_UNKNOWN -} - -func (x *ServicePort) GetServiceId() *StringNull { - if x != nil { - return x.ServiceId - } - return nil -} - -type ServiceStackConnectedServiceStack struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ServiceStack *ServiceStackLight `protobuf:"bytes,1,opt,name=serviceStack,proto3" json:"serviceStack,omitempty"` - Status ServiceStackConnectionStatus `protobuf:"varint,2,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackConnectionStatus" json:"status,omitempty"` -} - -func (x *ServiceStackConnectedServiceStack) Reset() { - *x = ServiceStackConnectedServiceStack{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[88] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServiceStackConnectedServiceStack) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceStackConnectedServiceStack) ProtoMessage() {} - -func (x *ServiceStackConnectedServiceStack) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[88] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceStackConnectedServiceStack.ProtoReflect.Descriptor instead. -func (*ServiceStackConnectedServiceStack) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{88} -} - -func (x *ServiceStackConnectedServiceStack) GetServiceStack() *ServiceStackLight { - if x != nil { - return x.ServiceStack - } - return nil -} - -func (x *ServiceStackConnectedServiceStack) GetStatus() ServiceStackConnectionStatus { - if x != nil { - return x.Status - } - return ServiceStackConnectionStatus_SERVICE_STACK_CONNECTION_STATUS_UNKNOWN -} - -type ServiceStackInfoJsonObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ServiceStackTypeName string `protobuf:"bytes,1,opt,name=serviceStackTypeName,proto3" json:"serviceStackTypeName,omitempty"` - ServiceStackTypeCategory ServiceStackTypeCategory `protobuf:"varint,2,opt,name=serviceStackTypeCategory,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackTypeCategory" json:"serviceStackTypeCategory,omitempty"` - ServiceStackTypeVersionName string `protobuf:"bytes,3,opt,name=serviceStackTypeVersionName,proto3" json:"serviceStackTypeVersionName,omitempty"` -} - -func (x *ServiceStackInfoJsonObject) Reset() { - *x = ServiceStackInfoJsonObject{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[89] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServiceStackInfoJsonObject) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceStackInfoJsonObject) ProtoMessage() {} - -func (x *ServiceStackInfoJsonObject) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[89] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceStackInfoJsonObject.ProtoReflect.Descriptor instead. -func (*ServiceStackInfoJsonObject) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{89} -} - -func (x *ServiceStackInfoJsonObject) GetServiceStackTypeName() string { - if x != nil { - return x.ServiceStackTypeName - } - return "" -} - -func (x *ServiceStackInfoJsonObject) GetServiceStackTypeCategory() ServiceStackTypeCategory { - if x != nil { - return x.ServiceStackTypeCategory - } - return ServiceStackTypeCategory_SERVICE_STACK_TYPE_CATEGORY_UNKNOWN -} - -func (x *ServiceStackInfoJsonObject) GetServiceStackTypeVersionName() string { - if x != nil { - return x.ServiceStackTypeVersionName - } - return "" -} - -type ServiceStackLight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Status ServiceStackStatus `protobuf:"varint,2,opt,name=status,proto3,enum=zBusinessZeropsApiProtocol.ServiceStackStatus" json:"status,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - ServiceStackTypeInfo *ServiceStackInfoJsonObject `protobuf:"bytes,4,opt,name=serviceStackTypeInfo,proto3" json:"serviceStackTypeInfo,omitempty"` - ServiceStackTypeId string `protobuf:"bytes,5,opt,name=serviceStackTypeId,proto3" json:"serviceStackTypeId,omitempty"` - ServiceStackTypeVersionId string `protobuf:"bytes,6,opt,name=serviceStackTypeVersionId,proto3" json:"serviceStackTypeVersionId,omitempty"` - IsSystem bool `protobuf:"varint,7,opt,name=isSystem,proto3" json:"isSystem,omitempty"` - StartOnProjectStart bool `protobuf:"varint,11,opt,name=startOnProjectStart,proto3" json:"startOnProjectStart,omitempty"` - GithubIntegration *GithubIntegrationNull `protobuf:"bytes,8,opt,name=githubIntegration,proto3" json:"githubIntegration,omitempty"` - GitlabIntegration *GitlabIntegrationNull `protobuf:"bytes,9,opt,name=gitlabIntegration,proto3" json:"gitlabIntegration,omitempty"` - CustomAutoscaling *CustomAutoscalingNull `protobuf:"bytes,12,opt,name=customAutoscaling,proto3" json:"customAutoscaling,omitempty"` -} - -func (x *ServiceStackLight) Reset() { - *x = ServiceStackLight{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[90] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServiceStackLight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceStackLight) ProtoMessage() {} - -func (x *ServiceStackLight) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[90] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceStackLight.ProtoReflect.Descriptor instead. -func (*ServiceStackLight) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{90} -} - -func (x *ServiceStackLight) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ServiceStackLight) GetStatus() ServiceStackStatus { - if x != nil { - return x.Status - } - return ServiceStackStatus_SERVICE_STACK_STATUS_UNKNOWN -} - -func (x *ServiceStackLight) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ServiceStackLight) GetServiceStackTypeInfo() *ServiceStackInfoJsonObject { - if x != nil { - return x.ServiceStackTypeInfo - } - return nil -} - -func (x *ServiceStackLight) GetServiceStackTypeId() string { - if x != nil { - return x.ServiceStackTypeId - } - return "" -} - -func (x *ServiceStackLight) GetServiceStackTypeVersionId() string { - if x != nil { - return x.ServiceStackTypeVersionId - } - return "" -} - -func (x *ServiceStackLight) GetIsSystem() bool { - if x != nil { - return x.IsSystem - } - return false -} - -func (x *ServiceStackLight) GetStartOnProjectStart() bool { - if x != nil { - return x.StartOnProjectStart - } - return false -} - -func (x *ServiceStackLight) GetGithubIntegration() *GithubIntegrationNull { - if x != nil { - return x.GithubIntegration - } - return nil -} - -func (x *ServiceStackLight) GetGitlabIntegration() *GitlabIntegrationNull { - if x != nil { - return x.GitlabIntegration - } - return nil -} - -func (x *ServiceStackLight) GetCustomAutoscaling() *CustomAutoscalingNull { - if x != nil { - return x.CustomAutoscaling - } - return nil -} - -type ServiceStackLightJsonObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Created *Timestamp `protobuf:"bytes,2,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,3,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - ProjectId string `protobuf:"bytes,4,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackTypeId string `protobuf:"bytes,5,opt,name=serviceStackTypeId,proto3" json:"serviceStackTypeId,omitempty"` - ServiceStackTypeVersionId string `protobuf:"bytes,6,opt,name=serviceStackTypeVersionId,proto3" json:"serviceStackTypeVersionId,omitempty"` - DriverId *StringNull `protobuf:"bytes,7,opt,name=driverId,proto3" json:"driverId,omitempty"` - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - ServiceStackTypeInfo *ServiceStackInfoJsonObject `protobuf:"bytes,9,opt,name=serviceStackTypeInfo,proto3" json:"serviceStackTypeInfo,omitempty"` - Ports []*ServicePort `protobuf:"bytes,10,rep,name=ports,proto3" json:"ports,omitempty"` -} - -func (x *ServiceStackLightJsonObject) Reset() { - *x = ServiceStackLightJsonObject{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[91] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServiceStackLightJsonObject) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceStackLightJsonObject) ProtoMessage() {} - -func (x *ServiceStackLightJsonObject) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[91] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceStackLightJsonObject.ProtoReflect.Descriptor instead. -func (*ServiceStackLightJsonObject) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{91} -} - -func (x *ServiceStackLightJsonObject) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ServiceStackLightJsonObject) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *ServiceStackLightJsonObject) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *ServiceStackLightJsonObject) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *ServiceStackLightJsonObject) GetServiceStackTypeId() string { - if x != nil { - return x.ServiceStackTypeId - } - return "" -} - -func (x *ServiceStackLightJsonObject) GetServiceStackTypeVersionId() string { - if x != nil { - return x.ServiceStackTypeVersionId - } - return "" -} - -func (x *ServiceStackLightJsonObject) GetDriverId() *StringNull { - if x != nil { - return x.DriverId - } - return nil -} - -func (x *ServiceStackLightJsonObject) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ServiceStackLightJsonObject) GetServiceStackTypeInfo() *ServiceStackInfoJsonObject { - if x != nil { - return x.ServiceStackTypeInfo - } - return nil -} - -func (x *ServiceStackLightJsonObject) GetPorts() []*ServicePort { - if x != nil { - return x.Ports - } - return nil -} - -type UserAvatar struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LargeAvatarUrl *StringNull `protobuf:"bytes,1,opt,name=largeAvatarUrl,proto3" json:"largeAvatarUrl,omitempty"` - SmallAvatarUrl *StringNull `protobuf:"bytes,2,opt,name=smallAvatarUrl,proto3" json:"smallAvatarUrl,omitempty"` - ExternalAvatarUrl *StringNull `protobuf:"bytes,3,opt,name=externalAvatarUrl,proto3" json:"externalAvatarUrl,omitempty"` -} - -func (x *UserAvatar) Reset() { - *x = UserAvatar{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[92] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserAvatar) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserAvatar) ProtoMessage() {} - -func (x *UserAvatar) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[92] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserAvatar.ProtoReflect.Descriptor instead. -func (*UserAvatar) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{92} -} - -func (x *UserAvatar) GetLargeAvatarUrl() *StringNull { - if x != nil { - return x.LargeAvatarUrl - } - return nil -} - -func (x *UserAvatar) GetSmallAvatarUrl() *StringNull { - if x != nil { - return x.SmallAvatarUrl - } - return nil -} - -func (x *UserAvatar) GetExternalAvatarUrl() *StringNull { - if x != nil { - return x.ExternalAvatarUrl - } - return nil -} - -type UserDataLight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` - ProjectId string `protobuf:"bytes,3,opt,name=projectId,proto3" json:"projectId,omitempty"` - ServiceStackId string `protobuf:"bytes,4,opt,name=serviceStackId,proto3" json:"serviceStackId,omitempty"` - Key string `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` - Content string `protobuf:"bytes,6,opt,name=content,proto3" json:"content,omitempty"` - Type UserDataType `protobuf:"varint,7,opt,name=type,proto3,enum=zBusinessZeropsApiProtocol.UserDataType" json:"type,omitempty"` - Created *Timestamp `protobuf:"bytes,8,opt,name=created,proto3" json:"created,omitempty"` - LastUpdate *Timestamp `protobuf:"bytes,9,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` - IsSynced bool `protobuf:"varint,10,opt,name=isSynced,proto3" json:"isSynced,omitempty"` - DeleteOnSync bool `protobuf:"varint,11,opt,name=deleteOnSync,proto3" json:"deleteOnSync,omitempty"` - Version UserDataVersion `protobuf:"varint,12,opt,name=version,proto3,enum=zBusinessZeropsApiProtocol.UserDataVersion" json:"version,omitempty"` - LastSync *TimestampNull `protobuf:"bytes,13,opt,name=lastSync,proto3" json:"lastSync,omitempty"` -} - -func (x *UserDataLight) Reset() { - *x = UserDataLight{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[93] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserDataLight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserDataLight) ProtoMessage() {} - -func (x *UserDataLight) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[93] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserDataLight.ProtoReflect.Descriptor instead. -func (*UserDataLight) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{93} -} - -func (x *UserDataLight) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *UserDataLight) GetClientId() string { - if x != nil { - return x.ClientId - } - return "" -} - -func (x *UserDataLight) GetProjectId() string { - if x != nil { - return x.ProjectId - } - return "" -} - -func (x *UserDataLight) GetServiceStackId() string { - if x != nil { - return x.ServiceStackId - } - return "" -} - -func (x *UserDataLight) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *UserDataLight) GetContent() string { - if x != nil { - return x.Content - } - return "" -} - -func (x *UserDataLight) GetType() UserDataType { - if x != nil { - return x.Type - } - return UserDataType_USER_DATA_TYPE_UNKNOWN -} - -func (x *UserDataLight) GetCreated() *Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *UserDataLight) GetLastUpdate() *Timestamp { - if x != nil { - return x.LastUpdate - } - return nil -} - -func (x *UserDataLight) GetIsSynced() bool { - if x != nil { - return x.IsSynced - } - return false -} - -func (x *UserDataLight) GetDeleteOnSync() bool { - if x != nil { - return x.DeleteOnSync - } - return false -} - -func (x *UserDataLight) GetVersion() UserDataVersion { - if x != nil { - return x.Version - } - return UserDataVersion_USER_DATA_VERSION_UNKNOWN -} - -func (x *UserDataLight) GetLastSync() *TimestampNull { - if x != nil { - return x.LastSync - } - return nil -} - -type UserJsonObject struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type UserJsonObjectType `protobuf:"varint,5,opt,name=type,proto3,enum=zBusinessZeropsApiProtocol.UserJsonObjectType" json:"type,omitempty"` - Id *StringNull `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Email *StringNull `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - FirstName *StringNull `protobuf:"bytes,3,opt,name=firstName,proto3" json:"firstName,omitempty"` - FullName *StringNull `protobuf:"bytes,4,opt,name=fullName,proto3" json:"fullName,omitempty"` - Avatar *UserAvatarNull `protobuf:"bytes,6,opt,name=avatar,proto3" json:"avatar,omitempty"` -} - -func (x *UserJsonObject) Reset() { - *x = UserJsonObject{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[94] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserJsonObject) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserJsonObject) ProtoMessage() {} - -func (x *UserJsonObject) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[94] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserJsonObject.ProtoReflect.Descriptor instead. -func (*UserJsonObject) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{94} -} - -func (x *UserJsonObject) GetType() UserJsonObjectType { - if x != nil { - return x.Type - } - return UserJsonObjectType_USER_JSON_OBJECT_TYPE_UNKNOWN -} - -func (x *UserJsonObject) GetId() *StringNull { - if x != nil { - return x.Id - } - return nil -} - -func (x *UserJsonObject) GetEmail() *StringNull { - if x != nil { - return x.Email - } - return nil -} - -func (x *UserJsonObject) GetFirstName() *StringNull { - if x != nil { - return x.FirstName - } - return nil -} - -func (x *UserJsonObject) GetFullName() *StringNull { - if x != nil { - return x.FullName - } - return nil -} - -func (x *UserJsonObject) GetAvatar() *UserAvatarNull { - if x != nil { - return x.Avatar - } - return nil -} - -type UserLight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - FullName string `protobuf:"bytes,3,opt,name=fullName,proto3" json:"fullName,omitempty"` - FirstName string `protobuf:"bytes,4,opt,name=firstName,proto3" json:"firstName,omitempty"` - LastName string `protobuf:"bytes,5,opt,name=lastName,proto3" json:"lastName,omitempty"` - Avatar *UserAvatarNull `protobuf:"bytes,6,opt,name=avatar,proto3" json:"avatar,omitempty"` -} - -func (x *UserLight) Reset() { - *x = UserLight{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[95] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserLight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserLight) ProtoMessage() {} - -func (x *UserLight) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[95] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserLight.ProtoReflect.Descriptor instead. -func (*UserLight) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{95} -} - -func (x *UserLight) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *UserLight) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *UserLight) GetFullName() string { - if x != nil { - return x.FullName - } - return "" -} - -func (x *UserLight) GetFirstName() string { - if x != nil { - return x.FirstName - } - return "" -} - -func (x *UserLight) GetLastName() string { - if x != nil { - return x.LastName - } - return "" -} - -func (x *UserLight) GetAvatar() *UserAvatarNull { - if x != nil { - return x.Avatar - } - return nil -} - -type VerticalAutoscaling struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - MaxResource *ScalingResource `protobuf:"bytes,1,opt,name=maxResource,proto3" json:"maxResource,omitempty"` - MinResource *ScalingResource `protobuf:"bytes,2,opt,name=minResource,proto3" json:"minResource,omitempty"` -} - -func (x *VerticalAutoscaling) Reset() { - *x = VerticalAutoscaling{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[96] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VerticalAutoscaling) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VerticalAutoscaling) ProtoMessage() {} - -func (x *VerticalAutoscaling) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[96] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VerticalAutoscaling.ProtoReflect.Descriptor instead. -func (*VerticalAutoscaling) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{96} -} - -func (x *VerticalAutoscaling) GetMaxResource() *ScalingResource { - if x != nil { - return x.MaxResource - } - return nil -} - -func (x *VerticalAutoscaling) GetMinResource() *ScalingResource { - if x != nil { - return x.MinResource - } - return nil -} - -type AppVersionBuildNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *AppVersionBuild `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *AppVersionBuildNull) Reset() { - *x = AppVersionBuildNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[97] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionBuildNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionBuildNull) ProtoMessage() {} - -func (x *AppVersionBuildNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[97] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionBuildNull.ProtoReflect.Descriptor instead. -func (*AppVersionBuildNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{97} -} - -func (x *AppVersionBuildNull) GetValue() *AppVersionBuild { - if x != nil { - return x.Value - } - return nil -} - -func (x *AppVersionBuildNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type AppVersionGithubIntegrationNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *AppVersionGithubIntegration `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *AppVersionGithubIntegrationNull) Reset() { - *x = AppVersionGithubIntegrationNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[98] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionGithubIntegrationNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionGithubIntegrationNull) ProtoMessage() {} - -func (x *AppVersionGithubIntegrationNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[98] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionGithubIntegrationNull.ProtoReflect.Descriptor instead. -func (*AppVersionGithubIntegrationNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{98} -} - -func (x *AppVersionGithubIntegrationNull) GetValue() *AppVersionGithubIntegration { - if x != nil { - return x.Value - } - return nil -} - -func (x *AppVersionGithubIntegrationNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type AppVersionGitlabIntegrationNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *AppVersionGitlabIntegration `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *AppVersionGitlabIntegrationNull) Reset() { - *x = AppVersionGitlabIntegrationNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[99] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionGitlabIntegrationNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionGitlabIntegrationNull) ProtoMessage() {} - -func (x *AppVersionGitlabIntegrationNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[99] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionGitlabIntegrationNull.ProtoReflect.Descriptor instead. -func (*AppVersionGitlabIntegrationNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{99} -} - -func (x *AppVersionGitlabIntegrationNull) GetValue() *AppVersionGitlabIntegration { - if x != nil { - return x.Value - } - return nil -} - -func (x *AppVersionGitlabIntegrationNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type AppVersionJsonObjectNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *AppVersionJsonObject `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *AppVersionJsonObjectNull) Reset() { - *x = AppVersionJsonObjectNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[100] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionJsonObjectNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionJsonObjectNull) ProtoMessage() {} - -func (x *AppVersionJsonObjectNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[100] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionJsonObjectNull.ProtoReflect.Descriptor instead. -func (*AppVersionJsonObjectNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{100} -} - -func (x *AppVersionJsonObjectNull) GetValue() *AppVersionJsonObject { - if x != nil { - return x.Value - } - return nil -} - -func (x *AppVersionJsonObjectNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type AppVersionLightNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *AppVersionLight `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *AppVersionLightNull) Reset() { - *x = AppVersionLightNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[101] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionLightNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionLightNull) ProtoMessage() {} - -func (x *AppVersionLightNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[101] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionLightNull.ProtoReflect.Descriptor instead. -func (*AppVersionLightNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{101} -} - -func (x *AppVersionLightNull) GetValue() *AppVersionLight { - if x != nil { - return x.Value - } - return nil -} - -func (x *AppVersionLightNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type AppVersionPublicGitSourceNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *AppVersionPublicGitSource `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *AppVersionPublicGitSourceNull) Reset() { - *x = AppVersionPublicGitSourceNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[102] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AppVersionPublicGitSourceNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AppVersionPublicGitSourceNull) ProtoMessage() {} - -func (x *AppVersionPublicGitSourceNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[102] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AppVersionPublicGitSourceNull.ProtoReflect.Descriptor instead. -func (*AppVersionPublicGitSourceNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{102} -} - -func (x *AppVersionPublicGitSourceNull) GetValue() *AppVersionPublicGitSource { - if x != nil { - return x.Value - } - return nil -} - -func (x *AppVersionPublicGitSourceNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type ClientAvatarNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *ClientAvatar `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *ClientAvatarNull) Reset() { - *x = ClientAvatarNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[103] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientAvatarNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientAvatarNull) ProtoMessage() {} - -func (x *ClientAvatarNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[103] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientAvatarNull.ProtoReflect.Descriptor instead. -func (*ClientAvatarNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{103} -} - -func (x *ClientAvatarNull) GetValue() *ClientAvatar { - if x != nil { - return x.Value - } - return nil -} - -func (x *ClientAvatarNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type CustomAutoscalingNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *CustomAutoscaling `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *CustomAutoscalingNull) Reset() { - *x = CustomAutoscalingNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[104] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CustomAutoscalingNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CustomAutoscalingNull) ProtoMessage() {} - -func (x *CustomAutoscalingNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[104] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CustomAutoscalingNull.ProtoReflect.Descriptor instead. -func (*CustomAutoscalingNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{104} -} - -func (x *CustomAutoscalingNull) GetValue() *CustomAutoscaling { - if x != nil { - return x.Value - } - return nil -} - -func (x *CustomAutoscalingNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type GithubIntegrationNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *GithubIntegration `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *GithubIntegrationNull) Reset() { - *x = GithubIntegrationNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[105] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GithubIntegrationNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GithubIntegrationNull) ProtoMessage() {} - -func (x *GithubIntegrationNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[105] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GithubIntegrationNull.ProtoReflect.Descriptor instead. -func (*GithubIntegrationNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{105} -} - -func (x *GithubIntegrationNull) GetValue() *GithubIntegration { - if x != nil { - return x.Value - } - return nil -} - -func (x *GithubIntegrationNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type GitlabIntegrationNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *GitlabIntegration `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *GitlabIntegrationNull) Reset() { - *x = GitlabIntegrationNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[106] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GitlabIntegrationNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GitlabIntegrationNull) ProtoMessage() {} - -func (x *GitlabIntegrationNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[106] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GitlabIntegrationNull.ProtoReflect.Descriptor instead. -func (*GitlabIntegrationNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{106} -} - -func (x *GitlabIntegrationNull) GetValue() *GitlabIntegration { - if x != nil { - return x.Value - } - return nil -} - -func (x *GitlabIntegrationNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type HorizontalAutoscalingNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *HorizontalAutoscaling `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *HorizontalAutoscalingNull) Reset() { - *x = HorizontalAutoscalingNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[107] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HorizontalAutoscalingNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HorizontalAutoscalingNull) ProtoMessage() {} - -func (x *HorizontalAutoscalingNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[107] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HorizontalAutoscalingNull.ProtoReflect.Descriptor instead. -func (*HorizontalAutoscalingNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{107} -} - -func (x *HorizontalAutoscalingNull) GetValue() *HorizontalAutoscaling { - if x != nil { - return x.Value - } - return nil -} - -func (x *HorizontalAutoscalingNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type Int32Null struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *Int32Null) Reset() { - *x = Int32Null{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[108] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Int32Null) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Int32Null) ProtoMessage() {} - -func (x *Int32Null) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[108] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Int32Null.ProtoReflect.Descriptor instead. -func (*Int32Null) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{108} -} - -func (x *Int32Null) GetValue() int32 { - if x != nil { - return x.Value - } - return 0 -} - -func (x *Int32Null) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type PrepareCustomRuntimeNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *PrepareCustomRuntime `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *PrepareCustomRuntimeNull) Reset() { - *x = PrepareCustomRuntimeNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[109] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PrepareCustomRuntimeNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PrepareCustomRuntimeNull) ProtoMessage() {} - -func (x *PrepareCustomRuntimeNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[109] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PrepareCustomRuntimeNull.ProtoReflect.Descriptor instead. -func (*PrepareCustomRuntimeNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{109} -} - -func (x *PrepareCustomRuntimeNull) GetValue() *PrepareCustomRuntime { - if x != nil { - return x.Value - } - return nil -} - -func (x *PrepareCustomRuntimeNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type StringNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *StringNull) Reset() { - *x = StringNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[110] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StringNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StringNull) ProtoMessage() {} - -func (x *StringNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[110] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StringNull.ProtoReflect.Descriptor instead. -func (*StringNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{110} -} - -func (x *StringNull) GetValue() string { - if x != nil { - return x.Value - } - return "" -} - -func (x *StringNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type TimestampNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *Timestamp `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *TimestampNull) Reset() { - *x = TimestampNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[111] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TimestampNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TimestampNull) ProtoMessage() {} - -func (x *TimestampNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[111] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TimestampNull.ProtoReflect.Descriptor instead. -func (*TimestampNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{111} -} - -func (x *TimestampNull) GetValue() *Timestamp { - if x != nil { - return x.Value - } - return nil -} - -func (x *TimestampNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type UserAvatarNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *UserAvatar `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *UserAvatarNull) Reset() { - *x = UserAvatarNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[112] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserAvatarNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserAvatarNull) ProtoMessage() {} - -func (x *UserAvatarNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[112] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserAvatarNull.ProtoReflect.Descriptor instead. -func (*UserAvatarNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{112} -} - -func (x *UserAvatarNull) GetValue() *UserAvatar { - if x != nil { - return x.Value - } - return nil -} - -func (x *UserAvatarNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type UserJsonObjectNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *UserJsonObject `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *UserJsonObjectNull) Reset() { - *x = UserJsonObjectNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[113] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserJsonObjectNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserJsonObjectNull) ProtoMessage() {} - -func (x *UserJsonObjectNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[113] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserJsonObjectNull.ProtoReflect.Descriptor instead. -func (*UserJsonObjectNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{113} -} - -func (x *UserJsonObjectNull) GetValue() *UserJsonObject { - if x != nil { - return x.Value - } - return nil -} - -func (x *UserJsonObjectNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -type VerticalAutoscalingNull struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Value *VerticalAutoscaling `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Valid bool `protobuf:"varint,2,opt,name=valid,proto3" json:"valid,omitempty"` -} - -func (x *VerticalAutoscalingNull) Reset() { - *x = VerticalAutoscalingNull{} - if protoimpl.UnsafeEnabled { - mi := &file_zeropsApiProtocol_proto_msgTypes[114] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VerticalAutoscalingNull) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VerticalAutoscalingNull) ProtoMessage() {} - -func (x *VerticalAutoscalingNull) ProtoReflect() protoreflect.Message { - mi := &file_zeropsApiProtocol_proto_msgTypes[114] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VerticalAutoscalingNull.ProtoReflect.Descriptor instead. -func (*VerticalAutoscalingNull) Descriptor() ([]byte, []int) { - return file_zeropsApiProtocol_proto_rawDescGZIP(), []int{114} -} - -func (x *VerticalAutoscalingNull) GetValue() *VerticalAutoscaling { - if x != nil { - return x.Value - } - return nil -} - -func (x *VerticalAutoscalingNull) GetValid() bool { - if x != nil { - return x.Valid - } - return false -} - -var File_zeropsApiProtocol_proto protoreflect.FileDescriptor - -var file_zeropsApiProtocol_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x70, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, - 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, - 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x22, 0x5a, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x53, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x69, 0x73, 0x53, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x6e, 0x61, 0x6e, 0x6f, 0x73, 0x22, 0x26, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, - 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x23, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x22, 0x2e, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x28, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x1c, 0x47, 0x65, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x15, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x4a, 0x0a, 0x18, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x22, 0xcf, 0x01, 0x0a, 0x1c, - 0x50, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x73, - 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x73, 0x73, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x12, 0x57, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x73, 0x74, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x51, 0x0a, - 0x1d, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, - 0x22, 0x51, 0x0a, 0x15, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x4b, 0x65, 0x79, 0x22, 0x6f, 0x0a, 0x1d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x64, 0x22, 0xa4, 0x01, 0x0a, 0x22, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6e, 0x64, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x1a, - 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4c, 0x0a, 0x0d, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x28, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x27, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x1d, 0x50, - 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x1b, - 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2c, 0x0a, 0x1a, 0x50, - 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x15, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, - 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x9e, 0x08, 0x0a, 0x18, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, - 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x41, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, - 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, - 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa8, 0x01, 0x0a, 0x1a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x51, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xa3, 0x08, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, - 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, - 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, - 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x49, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x9b, 0x08, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, - 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, - 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, - 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x50, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x5f, - 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x3f, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, - 0xa2, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4e, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0xf9, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x6a, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x19, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x6e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x1f, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x5f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x6c, - 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x11, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x21, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, - 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x05, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, - 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x0e, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x4a, 0x73, 0x6f, - 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x40, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x73, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, 0x75, 0x62, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, - 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x67, 0x0a, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, - 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x22, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x5b, 0x0a, - 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x67, 0x68, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x19, 0x68, 0x61, - 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x68, - 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4e, 0x0a, 0x22, 0x68, 0x61, 0x73, 0x55, - 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x68, 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, - 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x1b, 0x68, 0x61, 0x73, 0x55, - 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, - 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x68, - 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x68, 0x61, - 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, - 0x68, 0x61, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x3e, 0x0a, 0x1a, 0x68, 0x61, - 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, - 0x68, 0x61, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x69, 0x0a, 0x1c, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x69, 0x0a, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0xae, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0xff, 0x10, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x6a, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x4a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, - 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x3c, - 0x0a, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x69, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x4f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x6e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x5f, 0x0a, 0x11, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x11, 0x67, - 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x6c, 0x61, - 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x11, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, - 0x67, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, - 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, - 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x0e, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, - 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x40, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6f, - 0x72, 0x74, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, - 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, - 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x67, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x22, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x5b, 0x0a, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x10, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, - 0x19, 0x68, 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x19, 0x68, 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x73, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4e, 0x0a, 0x22, 0x68, - 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x68, 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, - 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x1b, 0x68, - 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x1b, 0x68, 0x61, 0x73, 0x55, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3e, 0x0a, - 0x1a, 0x68, 0x61, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x1a, 0x68, 0x61, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x3e, 0x0a, - 0x1a, 0x68, 0x61, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x1a, 0x68, 0x61, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x69, 0x0a, - 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x1c, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x69, 0x0a, 0x1c, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x1c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0xfd, 0x05, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, - 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x55, 0x0a, 0x12, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x64, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x12, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0b, - 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x08, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x4c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, - 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x53, 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x0e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x73, 0x53, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x73, 0x53, 0x65, 0x74, - 0x22, 0xa0, 0x01, 0x0a, 0x16, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0xb0, 0x04, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x52, 0x0a, 0x0c, - 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, - 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x22, 0xa6, 0x01, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x50, 0x0a, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0xbb, 0x01, 0x0a, 0x1c, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, - 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x5b, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x0d, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x22, 0xae, 0x01, - 0x0a, 0x1d, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x98, - 0x04, 0x0a, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x73, 0x73, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x73, 0x73, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4d, 0x0a, - 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x09, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, - 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, - 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x45, 0x64, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, 0x64, 0x69, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x22, 0xb0, 0x01, 0x0a, 0x1e, 0x50, 0x6f, - 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x55, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc0, 0x01, 0x0a, - 0x21, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, - 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x22, - 0xa0, 0x01, 0x0a, 0x16, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x7c, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, - 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x3d, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, - 0x22, 0xba, 0x01, 0x0a, 0x23, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x5a, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x42, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, - 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x41, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x08, - 0x0a, 0x26, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, - 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, - 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, - 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xaa, 0x01, 0x0a, - 0x1b, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x52, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, - 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xa4, 0x08, 0x0a, 0x1e, 0x50, 0x75, - 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, - 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, - 0x73, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, - 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, - 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0xa2, 0x01, 0x0a, 0x17, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4e, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xa0, 0x08, 0x0a, 0x1a, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4e, - 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x4c, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, 0x0a, 0x0d, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, - 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0e, - 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, - 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, - 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x61, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa0, 0x01, 0x0a, 0x16, 0x50, 0x75, 0x74, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x9f, 0x08, 0x0a, 0x19, - 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, - 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x50, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, - 0x73, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, - 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, - 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb0, 0x01, - 0x0a, 0x1e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x55, 0x0a, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0xa7, 0x08, 0x0a, 0x21, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, - 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, - 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, - 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, - 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, - 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, - 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, - 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xac, 0x01, 0x0a, 0x1c, 0x50, - 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x53, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, - 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xa5, 0x08, 0x0a, 0x1f, 0x50, 0x75, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, - 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, - 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, - 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, - 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x1b, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x52, 0x0a, 0x06, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x44, 0x74, 0x6f, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xa4, - 0x08, 0x0a, 0x1e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x74, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, - 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, - 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, - 0x54, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xcb, 0x06, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x10, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x10, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x64, 0x0a, - 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x61, 0x0a, 0x16, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x47, 0x0a, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x61, 0x63, 0x68, 0x65, 0x55, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x55, 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x68, 0x61, 0x73, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x68, 0x61, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x22, 0xe7, 0x02, 0x0a, 0x1b, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x40, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, - 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x73, 0x68, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x73, - 0x68, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, - 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xe7, 0x02, - 0x0a, 0x1b, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x6c, - 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, - 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x40, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, - 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x73, 0x68, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x73, 0x68, 0x65, 0x72, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, - 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x09, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, - 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3a, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x45, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4e, 0x75, 0x6c, 0x6c, 0x52, - 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x68, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x14, 0x70, 0x72, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x69, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x11, 0x67, - 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, - 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, - 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x0e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, - 0x63, 0x0a, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x47, 0x69, 0x74, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x47, 0x69, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x47, 0x69, 0x74, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0xef, 0x01, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, - 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x22, 0x53, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x47, 0x69, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x69, 0x74, 0x55, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x67, 0x69, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x7e, 0x0a, 0x12, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x84, 0x02, 0x0a, 0x0c, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x4e, 0x0a, 0x0e, 0x6c, 0x61, - 0x72, 0x67, 0x65, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x6c, 0x61, 0x72, 0x67, - 0x65, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x6d, - 0x61, 0x6c, 0x6c, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x6d, 0x61, 0x6c, - 0x6c, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x54, 0x0a, 0x11, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, - 0x22, 0xbb, 0x02, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x44, 0x0a, 0x09, 0x76, 0x61, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x09, 0x76, 0x61, 0x74, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xed, - 0x02, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x45, 0x78, 0x74, - 0x72, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x06, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0xe7, - 0x01, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x65, 0x0a, 0x13, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x56, - 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x13, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x6b, 0x0a, 0x15, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, - 0x61, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x15, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x75, 0x74, - 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x90, 0x03, 0x0a, 0x11, 0x47, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x46, 0x0a, 0x0a, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, - 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, - 0x6b, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x09, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x22, 0x90, 0x03, 0x0a, 0x11, - 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x15, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, - 0x46, 0x0a, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x77, 0x65, 0x62, - 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x09, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x49, 0x64, 0x22, 0x73, - 0x0a, 0x15, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x6f, - 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x2e, 0x0a, 0x08, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x40, 0x0a, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x54, 0x79, 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xab, 0x03, 0x0a, 0x14, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x61, 0x0a, 0x16, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x47, - 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x10, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x10, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x8d, 0x08, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, - 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, - 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, - 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0e, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, - 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x08, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x54, 0x0a, 0x0a, 0x61, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x84, 0x05, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, - 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x0a, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x56, 0x34, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, - 0x70, 0x56, 0x34, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x56, - 0x36, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, - 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x56, 0x36, 0x12, 0x58, 0x0a, 0x13, 0x7a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x13, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0xbf, 0x01, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4e, 0x75, 0x6c, 0x6c, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0c, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x41, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x87, 0x03, 0x0a, 0x16, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, - 0x6c, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, - 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x22, 0x80, 0x02, 0x0a, 0x17, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, - 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x69, 0x0a, 0x0e, 0x64, 0x6e, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0x6e, 0x73, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x64, 0x6e, 0x73, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x73, 0x73, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x53, 0x73, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x73, 0x73, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x19, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x64, 0x12, 0x60, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x87, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x4f, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x73, - 0x22, 0x79, 0x0a, 0x0f, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x72, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x43, 0x6f, - 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x47, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x47, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x69, 0x73, 0x6b, 0x47, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0a, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x9d, 0x02, 0x0a, 0x0b, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x4b, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, - 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x21, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x84, 0x02, 0x0a, 0x1a, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x70, 0x0a, 0x18, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x43, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x52, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x40, 0x0a, 0x1b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xca, 0x05, - 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x6a, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x19, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x6e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x5f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x6c, - 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x11, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, - 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xc4, 0x04, 0x0a, 0x1b, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x67, 0x68, 0x74, - 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, - 0x12, 0x3c, 0x0a, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x54, 0x79, 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x54, 0x79, 0x70, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x42, - 0x0a, 0x08, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x6a, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x14, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x22, 0x82, 0x02, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x12, 0x4e, 0x0a, 0x0e, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, - 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x0e, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, - 0x12, 0x4e, 0x0a, 0x0e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, - 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x0e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, - 0x12, 0x54, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x76, 0x61, 0x74, - 0x61, 0x72, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, - 0x75, 0x6c, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x22, 0xc1, 0x04, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x69, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x45, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x98, 0x03, 0x0a, 0x0e, 0x55, - 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, - 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x36, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, - 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x44, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, - 0x6c, 0x6c, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x42, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x06, 0x61, - 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0xcb, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x42, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x4e, 0x75, 0x6c, 0x6c, 0x52, 0x06, 0x61, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x22, 0xb3, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x0b, 0x6d, - 0x61, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x63, - 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x0b, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x6e, 0x0a, 0x13, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4e, 0x75, 0x6c, 0x6c, - 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x1f, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x4d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x1f, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, - 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x78, 0x0a, 0x18, 0x41, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x73, - 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x6e, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x41, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x47, 0x69, 0x74, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x4b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x47, 0x69, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x68, 0x0a, 0x10, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x3e, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x22, 0x72, 0x0a, 0x15, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x75, - 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x43, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x72, 0x0a, 0x15, 0x47, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, - 0x6c, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x72, 0x0a, 0x15, - 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x22, 0x7a, 0x0a, 0x19, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x75, - 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x47, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, - 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x37, 0x0a, 0x09, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x78, 0x0a, 0x18, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4e, 0x75, 0x6c, - 0x6c, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, - 0x38, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x62, 0x0a, 0x0d, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x64, 0x0a, - 0x0e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x4e, 0x75, 0x6c, 0x6c, 0x12, - 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x22, 0x6c, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x40, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x22, 0x76, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x75, 0x74, - 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x45, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, - 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2a, 0xf4, 0x5a, 0x0a, 0x09, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, - 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, - 0x12, 0x0e, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xc6, 0x02, - 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x57, - 0x49, 0x54, 0x48, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, - 0x54, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x04, 0x12, 0x1b, - 0x0a, 0x17, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x50, - 0x52, 0x49, 0x56, 0x49, 0x4c, 0x45, 0x47, 0x45, 0x53, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x52, - 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, - 0x4e, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x07, 0x12, 0x27, - 0x0a, 0x23, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x46, 0x52, - 0x41, 0x55, 0x44, 0x5f, 0x42, 0x45, 0x48, 0x41, 0x56, 0x49, 0x4f, 0x52, 0x5f, 0x44, 0x45, 0x54, - 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x5f, 0x43, 0x41, - 0x50, 0x54, 0x43, 0x48, 0x41, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x09, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x4f, 0x57, 0x4e, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x0a, 0x12, - 0x1e, 0x0a, 0x1a, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x53, 0x45, - 0x52, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, 0x0b, 0x12, - 0x20, 0x0a, 0x1c, 0x4e, 0x4f, 0x5f, 0x52, 0x49, 0x47, 0x48, 0x54, 0x53, 0x5f, 0x54, 0x4f, 0x5f, - 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x0c, 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x0d, 0x12, - 0x22, 0x0a, 0x1e, 0x41, 0x44, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x56, 0x45, - 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x0e, 0x12, 0x19, 0x0a, 0x14, 0x41, 0x54, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, - 0x4f, 0x4e, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x52, 0x10, 0xbf, 0x01, 0x12, 0x38, - 0x0a, 0x34, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4d, 0x55, - 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, - 0x54, 0x4f, 0x5f, 0x41, 0x54, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x10, 0x0f, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, - 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x5f, 0x54, 0x4f, - 0x4f, 0x5f, 0x53, 0x48, 0x4f, 0x52, 0x54, 0x10, 0x8e, 0x02, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, - 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, - 0x8d, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x4e, 0x4f, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4e, - 0x59, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x10, 0x12, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, - 0x49, 0x45, 0x4e, 0x54, 0x10, 0x13, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, - 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x14, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4c, 0x49, - 0x45, 0x4e, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x15, 0x12, - 0x17, 0x0a, 0x13, 0x4e, 0x4f, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x5f, - 0x5a, 0x45, 0x52, 0x4f, 0x50, 0x53, 0x10, 0x16, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x17, 0x12, 0x19, 0x0a, 0x15, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, - 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x18, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x19, 0x12, - 0x1a, 0x0a, 0x15, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, - 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x53, 0x10, 0x98, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x44, - 0x4f, 0x57, 0x4e, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, - 0x1a, 0x12, 0x20, 0x0a, 0x1b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x41, 0x43, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x10, 0xce, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x1b, 0x12, 0x19, 0x0a, 0x15, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x1c, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x1d, 0x12, 0x20, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x5f, 0x55, 0x53, 0x45, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, - 0x4d, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0xb4, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x4f, 0x52, - 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 0x1e, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, - 0x4b, 0x45, 0x59, 0x10, 0x1f, 0x12, 0x1a, 0x0a, 0x16, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x20, 0x12, 0x1f, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, - 0xa8, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xe3, 0x01, 0x12, 0x1a, 0x0a, - 0x16, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x22, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x45, 0x4d, - 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, - 0x23, 0x12, 0x34, 0x0a, 0x30, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x41, 0x4c, - 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, - 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x24, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, - 0x25, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x53, 0x45, - 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x26, 0x12, 0x29, 0x0a, 0x25, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x27, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x45, 0x58, 0x49, - 0x53, 0x54, 0x53, 0x10, 0x28, 0x12, 0x25, 0x0a, 0x21, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x4c, - 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, - 0x54, 0x4f, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x4e, 0x59, 0x10, 0x29, 0x12, 0x15, 0x0a, 0x11, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, - 0x44, 0x10, 0x2a, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x43, 0x4f, 0x52, 0x44, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x2b, 0x12, 0x25, 0x0a, 0x21, 0x4d, 0x41, 0x58, - 0x49, 0x4d, 0x55, 0x4d, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4f, 0x46, 0x5f, 0x43, - 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x2c, - 0x12, 0x27, 0x0a, 0x23, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x49, 0x4e, 0x5f, 0x42, 0x45, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x2d, 0x12, 0x25, 0x0a, 0x21, 0x55, 0x4e, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x59, 0x4f, - 0x55, 0x52, 0x5f, 0x4f, 0x57, 0x4e, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x2e, - 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x2f, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, - 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x42, 0x45, 0x45, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x10, 0x30, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x41, 0x44, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x58, - 0x50, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x31, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x4e, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x32, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4c, 0x49, 0x45, - 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, - 0x42, 0x45, 0x45, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x33, 0x12, 0x16, - 0x0a, 0x12, 0x4c, 0x41, 0x4e, 0x47, 0x55, 0x41, 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x34, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x41, 0x4e, 0x47, 0x55, 0x41, - 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, - 0x10, 0x35, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, - 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x36, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x43, 0x4f, 0x52, - 0x44, 0x5f, 0x49, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x37, - 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x43, 0x4f, 0x52, 0x44, 0x5f, 0x49, 0x53, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x38, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, 0x43, 0x4f, 0x52, - 0x44, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x45, 0x44, 0x49, - 0x54, 0x10, 0x39, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x3d, - 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, - 0x10, 0x3e, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x3f, 0x12, 0x2c, 0x0a, 0x28, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x53, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x40, 0x12, 0x2d, 0x0a, 0x29, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, - 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x41, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, - 0x42, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x49, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x43, 0x12, 0x29, - 0x0a, 0x25, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, - 0x49, 0x53, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, - 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x44, 0x12, 0x2f, 0x0a, 0x2b, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, - 0x4d, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x5f, - 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x45, 0x12, 0x38, 0x0a, 0x34, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, - 0x43, 0x48, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x10, 0x46, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x44, 0x49, - 0x53, 0x4b, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x47, 0x12, 0x28, - 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, - 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x4d, 0x49, 0x4e, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x48, 0x12, 0x30, 0x0a, 0x2c, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x41, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x49, 0x12, 0x2a, 0x0a, 0x25, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x49, 0x54, - 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, - 0x55, 0x4e, 0x44, 0x10, 0x99, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, - 0x49, 0x52, 0x45, 0x44, 0x10, 0x4a, 0x12, 0x2f, 0x0a, 0x2b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x42, - 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 0x4b, 0x12, 0x2f, 0x0a, 0x2b, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, - 0x41, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x4f, 0x52, - 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 0x4c, 0x12, 0x2a, 0x0a, 0x25, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x4e, 0x44, 0x41, 0x52, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, - 0x4e, 0x10, 0xf2, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x49, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x54, - 0x4f, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x4d, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x49, 0x53, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x4e, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x4c, 0x4f, 0x41, - 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x4f, 0x12, 0x1f, 0x0a, 0x1a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x4e, 0x47, 0x49, 0x4e, 0x58, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, - 0xc2, 0x01, 0x12, 0x33, 0x0a, 0x2f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x55, 0x42, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x43, - 0x43, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x44, 0x49, 0x53, - 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x51, 0x12, 0x1b, 0x0a, 0x16, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, - 0x47, 0x10, 0xb2, 0x01, 0x12, 0x1c, 0x0a, 0x17, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0xb3, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x41, 0x54, 0x45, - 0x47, 0x4f, 0x52, 0x59, 0x10, 0xcb, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x89, 0x02, - 0x12, 0x24, 0x0a, 0x1f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x9a, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x52, - 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x9b, 0x02, 0x12, 0x34, 0x0a, 0x2f, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, - 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x9c, 0x02, - 0x12, 0x37, 0x0a, 0x32, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, - 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, - 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x53, 0x5f, 0x46, 0x4f, 0x52, - 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 0xc9, 0x02, 0x12, 0x2a, 0x0a, 0x25, 0x53, 0x48, 0x41, - 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0xc8, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x52, 0x12, 0x1b, 0x0a, 0x17, - 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x49, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, - 0x44, 0x59, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x10, 0x53, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, - 0x43, 0x45, 0x53, 0x53, 0x5f, 0x49, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, - 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x55, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x4e, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, - 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x57, 0x12, 0x39, 0x0a, 0x34, 0x43, 0x52, 0x45, 0x41, 0x54, - 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, - 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, - 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, - 0xc3, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x50, - 0x41, 0x49, 0x52, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x3b, 0x12, 0x13, - 0x0a, 0x0f, 0x4e, 0x4f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x53, 0x59, 0x4e, - 0x43, 0x10, 0x3c, 0x12, 0x28, 0x0a, 0x24, 0x49, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x4f, - 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x41, - 0x4e, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x3a, 0x12, 0x2a, 0x0a, - 0x26, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x5f, 0x49, 0x4e, 0x5f, - 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x58, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x4c, 0x44, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, - 0x44, 0x10, 0x59, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, - 0x54, 0x45, 0x44, 0x10, 0x5a, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x5b, 0x12, 0x1a, 0x0a, 0x15, - 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0xa7, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x55, - 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x5c, 0x12, 0x1e, 0x0a, 0x1a, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4e, 0x41, - 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x5d, 0x12, 0x2d, 0x0a, 0x29, - 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x5e, 0x12, 0x39, 0x0a, 0x35, 0x4c, - 0x37, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x52, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x5f, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x57, 0x49, 0x4c, 0x4c, 0x5f, 0x42, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x10, 0x60, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x57, - 0x49, 0x4c, 0x4c, 0x5f, 0x42, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x80, - 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x57, 0x49, 0x4c, - 0x4c, 0x5f, 0x42, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x81, 0x02, 0x12, - 0x19, 0x0a, 0x15, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x57, 0x49, 0x4c, 0x4c, 0x5f, 0x42, 0x45, - 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x61, 0x12, 0x25, 0x0a, 0x20, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x57, - 0x49, 0x4c, 0x4c, 0x5f, 0x42, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x9e, - 0x02, 0x12, 0x25, 0x0a, 0x20, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x5f, 0x50, 0x52, - 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x57, 0x49, 0x4c, 0x4c, 0x5f, 0x42, 0x45, 0x5f, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x9f, 0x02, 0x12, 0x28, 0x0a, 0x23, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4f, 0x46, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x57, 0x49, 0x4c, 0x4c, 0x5f, 0x42, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x45, 0x44, 0x10, - 0xa0, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, - 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, - 0x55, 0x4e, 0x44, 0x10, 0x62, 0x12, 0x34, 0x0a, 0x30, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, - 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x54, 0x5f, - 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, - 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x63, 0x12, 0x2d, 0x0a, 0x29, 0x50, - 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, - 0x4e, 0x47, 0x5f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f, 0x4d, - 0x41, 0x49, 0x4e, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x64, 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x55, - 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, - 0x47, 0x5f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x4c, 0x4c, - 0x42, 0x41, 0x43, 0x4b, 0x10, 0x65, 0x12, 0x40, 0x0a, 0x3c, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, - 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x55, - 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4e, - 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x4e, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x52, - 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x66, 0x12, 0x3d, 0x0a, 0x39, 0x50, 0x55, 0x42, 0x4c, - 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, - 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, - 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x4e, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x52, 0x4f, - 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x67, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x55, 0x42, 0x4c, 0x49, - 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, - 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x53, 0x10, 0x68, 0x12, 0x23, 0x0a, 0x1f, 0x50, 0x55, 0x42, - 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x53, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x69, 0x12, 0x27, - 0x0a, 0x23, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, - 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x6a, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x55, 0x42, 0x4c, 0x49, - 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, - 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x6b, 0x12, 0x30, - 0x0a, 0x2c, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, - 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x4f, - 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x46, 0x51, 0x44, 0x4e, 0x10, 0x6c, - 0x12, 0x24, 0x0a, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, - 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x53, 0x4c, 0x5f, 0x46, 0x41, 0x4c, 0x4c, - 0x42, 0x41, 0x43, 0x4b, 0x10, 0x6d, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, - 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, - 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x6e, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x55, 0x42, 0x4c, 0x49, - 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, - 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x10, 0x6f, 0x12, 0x3c, 0x0a, 0x38, 0x50, 0x55, 0x42, - 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x50, - 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x10, 0x70, 0x12, 0x3c, 0x0a, 0x38, 0x50, 0x55, 0x42, 0x4c, 0x49, - 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x41, 0x43, 0x43, - 0x45, 0x53, 0x53, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, - 0x55, 0x4e, 0x44, 0x10, 0x71, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, - 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x51, - 0x55, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x54, 0x43, 0x50, 0x5f, 0x50, 0x4f, - 0x52, 0x54, 0x10, 0x72, 0x12, 0x3b, 0x0a, 0x37, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, - 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, - 0x73, 0x12, 0x3a, 0x0a, 0x35, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, - 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, - 0x45, 0x4e, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x50, 0x53, 0x5f, 0x53, 0x55, 0x42, 0x44, 0x4f, 0x4d, - 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x55, 0x46, 0x46, 0x49, 0x58, 0x10, 0xc7, 0x02, 0x12, 0x2f, 0x0a, - 0x2b, 0x4e, 0x4f, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, - 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x5f, 0x4c, 0x37, 0x5f, 0x48, 0x54, - 0x54, 0x50, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x10, 0x74, 0x12, 0x15, - 0x0a, 0x11, 0x53, 0x53, 0x4c, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, - 0x54, 0x45, 0x44, 0x10, 0x75, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, - 0x52, 0x45, 0x44, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x5f, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, 0x76, 0x12, - 0x25, 0x0a, 0x21, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x53, 0x55, 0x46, 0x46, 0x49, 0x58, - 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x77, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x78, 0x12, 0x24, - 0x0a, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, - 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x79, 0x12, 0x29, 0x0a, 0x24, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, - 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x56, 0x45, 0x52, 0x53, - 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0xa9, 0x01, 0x12, - 0x15, 0x0a, 0x11, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, - 0x41, 0x4e, 0x47, 0x45, 0x10, 0x7a, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, - 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x7b, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x7c, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x44, - 0x50, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, - 0x45, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x7d, 0x12, 0x1f, 0x0a, 0x1b, - 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x7e, 0x12, 0x1f, 0x0a, - 0x1a, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, - 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x4f, 0x4e, 0x45, 0x10, 0x80, 0x01, 0x12, 0x26, - 0x0a, 0x21, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x52, 0x45, 0x51, 0x55, - 0x45, 0x53, 0x54, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, - 0x49, 0x4e, 0x47, 0x10, 0x82, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, - 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x83, 0x01, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x55, 0x42, 0x4c, - 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x84, 0x01, 0x12, 0x21, 0x0a, 0x1c, - 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x85, 0x01, 0x12, - 0x30, 0x0a, 0x2b, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x54, - 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x86, - 0x01, 0x12, 0x27, 0x0a, 0x22, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x52, 0x54, - 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, - 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x87, 0x01, 0x12, 0x21, 0x0a, 0x1c, 0x49, 0x4e, - 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x55, 0x50, 0x4c, - 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0xb5, 0x01, 0x12, 0x25, 0x0a, - 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x4f, 0x55, - 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x88, 0x01, 0x12, 0x2a, 0x0a, 0x25, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x49, 0x50, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x89, 0x01, - 0x12, 0x31, 0x0a, 0x2c, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, - 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x49, 0x52, 0x45, 0x57, 0x41, 0x4c, 0x4c, - 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x4c, 0x49, 0x43, 0x54, - 0x10, 0x8a, 0x01, 0x12, 0x29, 0x0a, 0x24, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x50, 0x4f, - 0x52, 0x54, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0xaa, 0x01, 0x12, 0x36, - 0x0a, 0x31, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x4f, - 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, - 0x45, 0x44, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x43, - 0x4f, 0x52, 0x44, 0x10, 0x8b, 0x01, 0x12, 0x3f, 0x0a, 0x3a, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, - 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x50, 0x4f, 0x52, - 0x54, 0x53, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x10, 0xbe, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x44, 0x52, 0x49, 0x56, 0x45, - 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x8c, 0x01, 0x12, 0x27, - 0x0a, 0x22, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, - 0x49, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x10, 0x8d, 0x01, 0x12, 0x17, 0x0a, 0x12, 0x44, 0x52, 0x49, 0x56, 0x45, - 0x52, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x8e, 0x01, - 0x12, 0x2a, 0x0a, 0x25, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, - 0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x8f, 0x01, 0x12, 0x1a, 0x0a, 0x15, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x41, 0x53, 0x53, - 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x90, 0x01, 0x12, 0x2d, 0x0a, 0x28, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, - 0x49, 0x52, 0x45, 0x44, 0x10, 0x91, 0x01, 0x12, 0x1a, 0x0a, 0x15, 0x41, 0x50, 0x50, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, - 0x10, 0x92, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x10, 0x93, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x50, - 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x94, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, - 0x54, 0x48, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x95, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x4f, 0x42, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x96, 0x01, 0x12, - 0x15, 0x0a, 0x10, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, - 0x55, 0x4e, 0x44, 0x10, 0x97, 0x01, 0x12, 0x2b, 0x0a, 0x26, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x45, - 0x53, 0x54, 0x49, 0x4d, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, - 0x10, 0x98, 0x01, 0x12, 0x1a, 0x0a, 0x15, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x49, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0xe2, 0x01, 0x12, - 0x20, 0x0a, 0x1b, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, - 0x4f, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xb6, - 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x49, 0x53, 0x5f, 0x42, 0x45, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, - 0x45, 0x44, 0x10, 0xc4, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, - 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x53, 0x5f, 0x42, 0x45, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x55, - 0x49, 0x4c, 0x54, 0x10, 0xc5, 0x01, 0x12, 0x26, 0x0a, 0x21, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x42, 0x45, 0x49, - 0x4e, 0x47, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x45, 0x44, 0x10, 0xc6, 0x01, 0x12, 0x21, - 0x0a, 0x1c, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, - 0x50, 0x4c, 0x4f, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xc7, - 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0xc8, 0x01, 0x12, 0x22, 0x0a, 0x1d, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0xe1, 0x01, 0x12, 0x25, 0x0a, 0x20, 0x41, 0x50, 0x50, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x46, - 0x49, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0xc4, 0x02, 0x12, 0x23, - 0x0a, 0x1e, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, - 0x10, 0x9d, 0x02, 0x12, 0x2b, 0x0a, 0x26, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x44, 0x45, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0xb2, 0x02, - 0x12, 0x1d, 0x0a, 0x18, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, - 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x99, 0x01, 0x12, - 0x23, 0x0a, 0x1e, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, - 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, - 0x54, 0x10, 0x9a, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x9b, 0x01, 0x12, 0x24, 0x0a, - 0x1f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, - 0x10, 0x9c, 0x01, 0x12, 0x28, 0x0a, 0x23, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x10, 0x9d, 0x01, 0x12, 0x2f, 0x0a, - 0x2a, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, - 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x9e, 0x01, 0x12, 0x2c, - 0x0a, 0x27, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x9f, 0x01, 0x12, 0x1a, 0x0a, 0x15, - 0x44, 0x49, 0x46, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x49, 0x44, 0x53, 0x10, 0xa0, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x53, 0x54, 0x41, 0x54, - 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, - 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0xab, - 0x01, 0x12, 0x2f, 0x0a, 0x2a, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, - 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x47, - 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x42, 0x59, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0xc0, 0x01, 0x12, 0x2b, 0x0a, 0x26, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, - 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x49, 0x44, 0x5f, 0x46, 0x49, - 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0xac, 0x01, 0x12, - 0x2d, 0x0a, 0x28, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, - 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x49, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0xad, 0x01, 0x12, 0x34, - 0x0a, 0x2f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, - 0x44, 0x10, 0xae, 0x01, 0x12, 0x2f, 0x0a, 0x2a, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, 0x49, - 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x48, 0x49, 0x53, - 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, - 0x45, 0x44, 0x10, 0xc1, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, - 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x52, 0x41, - 0x4e, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x92, 0x02, 0x12, 0x38, - 0x0a, 0x33, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x45, 0x49, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x52, 0x41, - 0x4e, 0x47, 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x51, - 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x96, 0x02, 0x12, 0x2d, 0x0a, 0x28, 0x53, 0x54, 0x41, 0x54, - 0x53, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, - 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, - 0x49, 0x52, 0x45, 0x44, 0x10, 0x94, 0x02, 0x12, 0x2b, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x10, 0x84, 0x02, 0x12, 0x33, 0x0a, 0x2e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x42, 0x59, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x85, 0x02, 0x12, 0x2b, 0x0a, 0x26, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x91, 0x02, 0x12, 0x30, 0x0a, 0x2b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x41, 0x52, - 0x43, 0x48, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x51, - 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x86, 0x02, 0x12, 0x2f, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x45, - 0x41, 0x52, 0x43, 0x48, 0x5f, 0x49, 0x44, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x87, 0x02, 0x12, 0x3c, 0x0a, 0x37, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x45, 0x49, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x52, 0x41, 0x4e, - 0x47, 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, - 0x49, 0x52, 0x45, 0x44, 0x10, 0x95, 0x02, 0x12, 0x31, 0x0a, 0x2c, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x52, - 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x90, 0x02, 0x12, 0x41, 0x0a, 0x3c, 0x54, 0x52, - 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, 0x49, 0x54, 0x5f, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x54, 0x49, 0x4c, 0x4c, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5a, 0x4f, - 0x4e, 0x45, 0x53, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x45, 0x52, 0x10, 0xac, 0x02, 0x12, 0x2e, 0x0a, - 0x29, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, - 0x49, 0x54, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5a, 0x4f, 0x4e, 0x45, 0x10, 0xad, 0x02, 0x12, 0x2c, 0x0a, - 0x27, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x42, - 0x49, 0x54, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x10, 0x8f, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x47, - 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0xbc, 0x01, 0x12, 0x20, 0x0a, - 0x1b, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, - 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xb6, 0x01, 0x12, - 0x1a, 0x0a, 0x15, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xb7, 0x01, 0x12, 0x22, 0x0a, 0x1d, 0x47, - 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0xb8, 0x01, 0x12, - 0x21, 0x0a, 0x1c, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, - 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, - 0xb9, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x4e, 0x4f, 0x5f, - 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xba, 0x01, 0x12, 0x26, 0x0a, 0x21, 0x47, 0x49, 0x54, 0x48, 0x55, - 0x42, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x43, 0x43, - 0x45, 0x53, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0xbb, 0x01, 0x12, - 0x1f, 0x0a, 0x1a, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0xbd, 0x01, - 0x12, 0x28, 0x0a, 0x23, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x5f, 0x4e, 0x4f, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xce, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x42, 0x52, - 0x41, 0x4e, 0x43, 0x48, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, - 0x45, 0x44, 0x10, 0xcf, 0x01, 0x12, 0x2d, 0x0a, 0x28, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, - 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x53, 0x5f, - 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x10, 0x8c, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, - 0x52, 0x45, 0x44, 0x10, 0xd0, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x4e, 0x4f, 0x5f, 0x45, 0x58, 0x54, - 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x4f, 0x52, 0x59, - 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xd1, 0x01, 0x12, - 0x1a, 0x0a, 0x15, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, - 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xd2, 0x01, 0x12, 0x1b, 0x0a, 0x16, 0x47, - 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xd3, 0x01, 0x12, 0x26, 0x0a, 0x21, 0x47, 0x49, 0x54, 0x48, - 0x55, 0x42, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53, 0x10, 0xd4, 0x01, - 0x12, 0x24, 0x0a, 0x1f, 0x55, 0x4e, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x47, - 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0xda, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x5a, 0x45, 0x52, 0x4f, 0x50, 0x53, - 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xdb, 0x01, 0x12, 0x1d, 0x0a, 0x18, 0x49, 0x4e, 0x43, 0x4f, - 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x5f, 0x53, 0x45, - 0x43, 0x52, 0x45, 0x54, 0x10, 0xd5, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x55, 0x4e, 0x53, 0x55, 0x50, - 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0xd6, 0x01, 0x12, 0x35, 0x0a, 0x30, - 0x52, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, - 0x10, 0xd7, 0x01, 0x12, 0x2e, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x4e, 0x45, 0x57, - 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, - 0x10, 0xd8, 0x01, 0x12, 0x18, 0x0a, 0x13, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x50, 0x55, - 0x53, 0x48, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44, 0x10, 0xd9, 0x01, 0x12, 0x20, 0x0a, - 0x1b, 0x5a, 0x45, 0x52, 0x4f, 0x50, 0x53, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x46, 0x49, - 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0xcc, 0x01, 0x12, - 0x21, 0x0a, 0x1c, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x44, 0x10, - 0xcd, 0x01, 0x12, 0x2d, 0x0a, 0x28, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x57, 0x52, 0x4f, - 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x46, 0x55, - 0x4c, 0x4c, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0xdc, - 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x57, 0x45, 0x42, 0x48, - 0x4f, 0x4f, 0x4b, 0x53, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, - 0x44, 0x45, 0x44, 0x10, 0xdd, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x41, 0x56, 0x41, 0x54, 0x41, 0x52, - 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, - 0x4e, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0xde, 0x01, 0x12, - 0x1b, 0x0a, 0x16, 0x41, 0x56, 0x41, 0x54, 0x41, 0x52, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, - 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0xdf, 0x01, 0x12, 0x21, 0x0a, 0x1c, - 0x41, 0x56, 0x41, 0x54, 0x41, 0x52, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x46, 0x49, - 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xe0, 0x01, 0x12, - 0x1f, 0x0a, 0x1a, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0xe4, 0x01, - 0x12, 0x20, 0x0a, 0x1b, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, - 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, - 0xe5, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x47, 0x49, - 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0xe6, 0x01, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x52, - 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xe7, 0x01, - 0x12, 0x22, 0x0a, 0x1d, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, - 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, - 0x44, 0x10, 0xe8, 0x01, 0x12, 0x24, 0x0a, 0x1f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x46, - 0x55, 0x4c, 0x4c, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x52, - 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0xe9, 0x01, 0x12, 0x28, 0x0a, 0x23, 0x4d, 0x55, - 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x52, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, - 0x4e, 0x10, 0xea, 0x01, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x42, - 0x52, 0x41, 0x4e, 0x43, 0x48, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xeb, 0x01, - 0x12, 0x1b, 0x0a, 0x16, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, - 0x4f, 0x4b, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0xec, 0x01, 0x12, 0x26, 0x0a, - 0x21, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, - 0x52, 0x53, 0x10, 0xed, 0x01, 0x12, 0x28, 0x0a, 0x23, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4e, 0x4f, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, - 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xee, 0x01, 0x12, - 0x18, 0x0a, 0x13, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x5f, 0x49, - 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44, 0x10, 0xef, 0x01, 0x12, 0x1c, 0x0a, 0x17, 0x59, 0x41, 0x4d, - 0x4c, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0xf0, 0x01, 0x12, 0x1e, 0x0a, 0x19, 0x59, 0x41, 0x4d, 0x4c, 0x5f, - 0x57, 0x52, 0x4f, 0x4e, 0x47, 0x5f, 0x55, 0x53, 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x10, 0xf1, 0x01, 0x12, 0x20, 0x0a, 0x1b, 0x56, 0x41, 0x54, 0x5f, 0x4e, - 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x45, 0x55, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x52, 0x59, 0x10, 0xfe, 0x01, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x4f, 0x4d, - 0x50, 0x41, 0x4e, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, - 0x4e, 0x5f, 0x45, 0x55, 0x10, 0x82, 0x02, 0x12, 0x17, 0x0a, 0x12, 0x56, 0x41, 0x54, 0x5f, 0x4e, - 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0xf4, 0x01, - 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, - 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0xf5, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x55, - 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x54, 0x5f, 0x4e, 0x55, 0x4d, 0x42, - 0x45, 0x52, 0x10, 0xfa, 0x01, 0x12, 0x1d, 0x0a, 0x18, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, - 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x4e, 0x59, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, - 0x52, 0x10, 0xae, 0x02, 0x12, 0x14, 0x0a, 0x0f, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, - 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0xaf, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x41, 0x44, - 0x4d, 0x49, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x8a, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x43, 0x52, - 0x45, 0x44, 0x49, 0x54, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, - 0x45, 0x44, 0x10, 0xf6, 0x01, 0x12, 0x18, 0x0a, 0x13, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, - 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x49, 0x54, 0x10, 0xf7, 0x01, 0x12, - 0x18, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xf8, 0x01, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x52, 0x4f, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x45, 0x44, 0x10, 0xf9, 0x01, 0x12, 0x1c, 0x0a, 0x17, 0x4d, 0x41, 0x58, 0x49, 0x4d, 0x55, 0x4d, - 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, - 0x10, 0x8b, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xfc, 0x01, 0x12, 0x16, - 0x0a, 0x11, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, - 0x55, 0x4e, 0x44, 0x10, 0xfd, 0x01, 0x12, 0x14, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x4f, 0x4e, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xff, 0x01, 0x12, 0x16, 0x0a, 0x11, - 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, - 0x44, 0x10, 0x83, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4c, 0x49, - 0x53, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x88, 0x02, 0x12, - 0x19, 0x0a, 0x14, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x54, 0x4f, - 0x4f, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x10, 0x97, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x52, - 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x10, 0xa1, 0x02, 0x12, 0x2c, 0x0a, 0x27, - 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x53, 0x54, - 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x10, 0xa2, 0x02, 0x12, 0x25, 0x0a, 0x20, 0x50, 0x52, - 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0xa7, - 0x02, 0x12, 0x28, 0x0a, 0x23, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0xa4, 0x02, 0x12, 0x25, 0x0a, 0x20, 0x50, - 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x4d, 0x49, - 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, - 0xa5, 0x02, 0x12, 0x32, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, - 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x10, 0xa6, 0x02, 0x12, 0x24, 0x0a, 0x1f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x44, 0x10, 0xa8, 0x02, 0x12, 0x23, 0x0a, 0x1e, - 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, - 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0xa9, - 0x02, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4d, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x10, 0xaa, 0x02, 0x12, 0x25, 0x0a, 0x20, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, - 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0xb5, 0x02, 0x12, 0x2d, 0x0a, - 0x28, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, - 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x50, 0x55, 0x5f, - 0x52, 0x41, 0x4d, 0x5f, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x10, 0xcf, 0x02, 0x12, 0x42, 0x0a, 0x3d, - 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, - 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x42, - 0x49, 0x44, 0x44, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x53, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x10, 0xb1, 0x02, - 0x12, 0x44, 0x0a, 0x3f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, - 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x49, 0x4e, - 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x5f, - 0x54, 0x48, 0x49, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, - 0x4f, 0x52, 0x59, 0x10, 0xb3, 0x02, 0x12, 0x3b, 0x0a, 0x36, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x41, 0x55, 0x54, 0x4f, - 0x53, 0x43, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, - 0x4e, 0x5f, 0x49, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x48, 0x41, 0x5f, 0x4d, 0x4f, 0x44, 0x45, - 0x10, 0xb4, 0x02, 0x12, 0x2d, 0x0a, 0x28, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, - 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x53, - 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x10, - 0xb7, 0x02, 0x12, 0x32, 0x0a, 0x2d, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x5f, - 0x54, 0x48, 0x49, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, - 0x4f, 0x52, 0x59, 0x10, 0xb8, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x59, 0x41, 0x4d, 0x4c, 0x5f, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x10, 0xb0, 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x55, 0x4e, 0x45, - 0x58, 0x50, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x59, 0x41, 0x4d, 0x4c, 0x5f, 0x45, 0x4e, 0x43, - 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0xc5, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x42, 0x55, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, - 0x53, 0x10, 0xd0, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x53, 0x33, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x52, - 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xd1, 0x02, - 0x12, 0x1a, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x57, 0x41, 0x53, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xa1, 0x01, 0x12, 0x1c, 0x0a, 0x17, - 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x57, 0x41, 0x53, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0xa2, 0x01, 0x12, 0x37, 0x0a, 0x32, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x48, 0x41, 0x56, 0x45, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4e, 0x59, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, - 0x10, 0xa3, 0x01, 0x12, 0x22, 0x0a, 0x1d, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x48, 0x41, 0x53, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x5a, 0x45, - 0x52, 0x4f, 0x50, 0x53, 0x10, 0xa4, 0x01, 0x12, 0x18, 0x0a, 0x13, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xc3, - 0x01, 0x12, 0x19, 0x0a, 0x14, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, - 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xc1, 0x02, 0x12, 0x17, 0x0a, 0x12, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, - 0x4e, 0x47, 0x10, 0xc2, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0xbc, 0x02, - 0x12, 0x15, 0x0a, 0x10, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x49, 0x53, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0xb9, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, - 0xba, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x42, 0x4f, - 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, - 0x44, 0x10, 0xbb, 0x02, 0x12, 0x13, 0x0a, 0x0e, 0x41, 0x4d, 0x42, 0x49, 0x47, 0x55, 0x4f, 0x55, - 0x53, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0xca, 0x02, 0x12, 0x1b, 0x0a, 0x16, 0x41, 0x4d, 0x42, - 0x49, 0x47, 0x55, 0x4f, 0x55, 0x53, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, - 0x5f, 0x49, 0x4e, 0x10, 0xcb, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, - 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, 0x10, 0xbd, - 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x55, 0x52, - 0x52, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xc0, 0x02, 0x12, 0x1c, 0x0a, - 0x17, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, - 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0xbe, 0x02, 0x12, 0x13, 0x0a, 0x0e, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0xcd, 0x02, - 0x2a, 0xc6, 0x01, 0x0a, 0x24, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, 0x31, 0x41, 0x50, 0x50, - 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, - 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x34, 0x0a, 0x30, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x52, - 0x41, 0x4e, 0x43, 0x48, 0x10, 0x01, 0x12, 0x31, 0x0a, 0x2d, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, - 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x02, 0x2a, 0xc6, 0x01, 0x0a, 0x24, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x35, 0x0a, 0x31, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x34, 0x0a, 0x30, 0x41, 0x50, 0x50, - 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, - 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x10, 0x01, 0x12, - 0x31, 0x0a, 0x2d, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x47, - 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x47, - 0x10, 0x02, 0x2a, 0xc4, 0x01, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x50, 0x50, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x50, 0x50, 0x5f, 0x56, - 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4c, - 0x49, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x55, 0x49, 0x10, 0x02, 0x12, - 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x03, 0x12, 0x1d, - 0x0a, 0x19, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10, 0x04, 0x12, 0x1a, 0x0a, - 0x16, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x10, 0x05, 0x2a, 0xfe, 0x03, 0x0a, 0x10, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, - 0x0a, 0x1a, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x20, - 0x0a, 0x1c, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, - 0x12, 0x28, 0x0a, 0x24, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, - 0x4f, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x50, - 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, - 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x04, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, - 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x06, - 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x07, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, - 0x54, 0x4f, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x08, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x50, - 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x09, 0x12, - 0x28, 0x0a, 0x24, 0x41, 0x50, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x5f, - 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x0a, 0x12, 0x2f, 0x0a, 0x2b, 0x41, 0x50, 0x50, - 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, - 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0b, 0x12, 0x2e, 0x0a, 0x2a, 0x41, 0x50, - 0x50, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0c, 0x2a, 0x6b, 0x0a, 0x17, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, - 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x27, - 0x0a, 0x23, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4c, 0x49, - 0x47, 0x48, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x41, - 0x4e, 0x41, 0x47, 0x45, 0x52, 0x10, 0x01, 0x2a, 0xc2, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, - 0x5f, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4c, 0x49, 0x45, 0x4e, - 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x32, 0x0a, 0x2e, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x47, 0x48, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, - 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x45, 0x49, - 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x98, 0x01, 0x0a, - 0x1a, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x25, 0x47, - 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, - 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x10, 0x01, - 0x12, 0x25, 0x0a, 0x21, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x02, 0x2a, 0x98, 0x01, 0x0a, 0x1a, 0x47, 0x69, 0x74, 0x6c, - 0x61, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x25, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, - 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x47, - 0x49, 0x54, 0x4c, 0x41, 0x42, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x47, - 0x10, 0x02, 0x2a, 0xf6, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, - 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, - 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x43, - 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x42, - 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x43, - 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, - 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, - 0x44, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1b, - 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x89, 0x02, 0x0a, 0x0d, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, - 0x16, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x52, 0x4f, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x10, - 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x19, - 0x0a, 0x15, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x45, 0x4c, 0x45, - 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, - 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1a, - 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, - 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x2a, 0xf8, 0x02, 0x0a, 0x25, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x44, 0x6e, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, - 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, - 0x44, 0x4e, 0x53, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x55, - 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, - 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x44, 0x4e, 0x53, 0x5f, 0x43, 0x48, 0x45, - 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x01, 0x12, 0x38, 0x0a, 0x34, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, - 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, - 0x4e, 0x5f, 0x44, 0x4e, 0x53, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x32, 0x0a, - 0x2e, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, - 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x44, 0x4e, 0x53, 0x5f, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, - 0x03, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, - 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, - 0x44, 0x4e, 0x53, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x55, 0x42, - 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x44, 0x4e, 0x53, 0x5f, 0x43, 0x48, 0x45, 0x43, - 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44, - 0x10, 0x05, 0x2a, 0xf0, 0x02, 0x0a, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x73, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x55, 0x42, 0x4c, 0x49, - 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, - 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x53, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x32, 0x0a, 0x2e, 0x50, 0x55, - 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, - 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x53, 0x4c, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x39, - 0x0a, 0x35, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, - 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x53, 0x4c, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x45, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x39, 0x0a, 0x35, 0x50, 0x55, 0x42, - 0x4c, 0x49, 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x53, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x44, - 0x4e, 0x53, 0x10, 0x03, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x48, - 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, 0x4d, 0x41, - 0x49, 0x4e, 0x5f, 0x53, 0x53, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x04, 0x12, 0x3d, 0x0a, 0x39, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, - 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x4f, - 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x53, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, - 0x4c, 0x45, 0x44, 0x10, 0x05, 0x2a, 0x76, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x21, 0x0a, 0x1d, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, 0x52, 0x4f, - 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, - 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x74, 0x63, 0x70, 0x10, 0x01, 0x12, 0x1d, - 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x50, - 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x75, 0x64, 0x70, 0x10, 0x02, 0x2a, 0xac, 0x03, - 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x74, 0x63, 0x70, 0x10, - 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, - 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x75, 0x64, 0x70, 0x10, 0x02, 0x12, 0x1c, - 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, - 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, - 0x45, 0x4d, 0x45, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x73, 0x10, 0x04, 0x12, 0x1d, 0x0a, 0x19, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, - 0x4d, 0x45, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x73, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, - 0x45, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, - 0x5f, 0x75, 0x64, 0x70, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x78, 0x10, 0x08, 0x12, 0x1f, 0x0a, 0x1b, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, 0x48, - 0x45, 0x4d, 0x45, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x10, 0x09, 0x12, 0x22, 0x0a, - 0x1e, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x43, - 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x10, - 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, - 0x54, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x61, 0x6d, 0x71, 0x70, 0x10, 0x0b, 0x12, - 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, - 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x73, 0x74, 0x6f, 0x6d, 0x70, 0x10, 0x0c, 0x12, 0x1c, - 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, - 0x43, 0x48, 0x45, 0x4d, 0x45, 0x5f, 0x6d, 0x71, 0x74, 0x74, 0x10, 0x0d, 0x2a, 0xd3, 0x01, 0x0a, - 0x1c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x0a, - 0x27, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x28, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, - 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x2a, 0x0a, 0x26, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, - 0x10, 0x03, 0x2a, 0x6c, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x48, 0x41, 0x10, - 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x48, 0x41, 0x10, 0x02, - 0x2a, 0xdc, 0x0b, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x20, - 0x0a, 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x05, - 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, - 0x47, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x45, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x21, 0x0a, 0x1d, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, - 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, - 0x0a, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x1d, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x28, - 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x54, 0x4f, 0x5f, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x0e, 0x12, 0x29, 0x0a, 0x25, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, - 0x47, 0x10, 0x12, 0x12, 0x27, 0x0a, 0x23, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x23, 0x12, 0x29, 0x0a, 0x25, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x4f, - 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x15, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, - 0x16, 0x12, 0x29, 0x0a, 0x25, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x17, 0x12, 0x2b, 0x0a, 0x27, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x2a, 0x0a, 0x26, 0x53, 0x45, 0x52, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x4f, 0x41, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x0f, - 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, - 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x24, 0x12, 0x27, 0x0a, 0x23, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x10, 0x12, 0x2e, 0x0a, 0x2a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x1c, 0x12, 0x2a, 0x0a, 0x26, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x41, 0x49, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x11, 0x12, - 0x31, 0x0a, 0x2d, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x13, 0x12, 0x31, 0x0a, 0x2d, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, - 0x4e, 0x45, 0x52, 0x10, 0x14, 0x12, 0x2a, 0x0a, 0x26, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x1a, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x25, 0x12, 0x2e, 0x0a, 0x2a, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x41, - 0x49, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x26, 0x12, 0x22, 0x0a, 0x1e, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x41, 0x49, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x1e, 0x12, - 0x29, 0x0a, 0x25, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, - 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x29, 0x0a, 0x25, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x4d, 0x4f, 0x56, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, - 0x4e, 0x45, 0x52, 0x10, 0x20, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, - 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x52, 0x45, 0x50, 0x41, 0x49, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x22, 0x2a, - 0xcd, 0x03, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x54, 0x79, 0x70, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x23, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, - 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x43, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x30, 0x0a, 0x2c, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, - 0x4c, 0x37, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x52, 0x10, 0x02, 0x12, 0x28, 0x0a, - 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, - 0x4e, 0x44, 0x41, 0x52, 0x44, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, - 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x2e, 0x0a, - 0x2a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x48, 0x41, - 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x05, 0x12, 0x2e, 0x0a, - 0x2a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x06, 0x12, 0x25, 0x0a, - 0x21, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x42, 0x55, 0x49, - 0x4c, 0x44, 0x10, 0x07, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, - 0x4f, 0x52, 0x59, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x08, 0x12, 0x2f, - 0x0a, 0x2b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x50, 0x52, - 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x09, 0x2a, - 0x9a, 0x01, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x16, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, - 0x45, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x55, - 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, - 0x4d, 0x4d, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x03, 0x12, - 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x04, 0x2a, 0x72, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1d, 0x0a, 0x19, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x56, 0x45, 0x52, - 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1a, - 0x0a, 0x16, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x56, 0x45, 0x52, 0x53, - 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x10, 0x02, - 0x2a, 0xbd, 0x01, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10, 0x04, 0x12, 0x1e, - 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x02, 0x12, 0x20, - 0x0a, 0x1c, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x03, - 0x2a, 0x56, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, - 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, - 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, 0x13, 0x0a, 0x1a, 0x5a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x50, 0x75, 0x74, 0x41, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, - 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, - 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, - 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x9e, 0x01, 0x0a, 0x1b, 0x50, 0x75, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x12, 0x3e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, - 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x41, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3f, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, - 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x41, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x77, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x0d, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, - 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x80, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x77, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, - 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x11, 0x50, 0x6f, 0x73, - 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x15, 0x50, 0x6f, 0x73, - 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x12, 0x38, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, - 0x50, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x7a, - 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x32, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, - 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, - 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x13, 0x50, 0x75, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x36, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, - 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, - 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x37, 0x2e, 0x7a, 0x42, - 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, - 0x01, 0x0a, 0x16, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x39, 0x2e, 0x7a, 0x42, 0x75, 0x73, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x8c, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x8f, 0x01, 0x0a, 0x16, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x2e, 0x7a, 0x42, 0x75, - 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, - 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x6e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x2e, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, - 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x77, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x31, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, - 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x5a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x70, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x7a, 0x65, 0x72, 0x6f, 0x70, 0x73, 0x2d, - 0x69, 0x6f, 0x2f, 0x7a, 0x63, 0x6c, 0x69, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x7a, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x5a, 0x65, - 0x72, 0x6f, 0x70, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_zeropsApiProtocol_proto_rawDescOnce sync.Once - file_zeropsApiProtocol_proto_rawDescData = file_zeropsApiProtocol_proto_rawDesc -) - -func file_zeropsApiProtocol_proto_rawDescGZIP() []byte { - file_zeropsApiProtocol_proto_rawDescOnce.Do(func() { - file_zeropsApiProtocol_proto_rawDescData = protoimpl.X.CompressGZIP(file_zeropsApiProtocol_proto_rawDescData) - }) - return file_zeropsApiProtocol_proto_rawDescData -} - -var file_zeropsApiProtocol_proto_enumTypes = make([]protoimpl.EnumInfo, 23) -var file_zeropsApiProtocol_proto_msgTypes = make([]protoimpl.MessageInfo, 115) -var file_zeropsApiProtocol_proto_goTypes = []interface{}{ - (ErrorCode)(0), // 0: zBusinessZeropsApiProtocol.ErrorCode - (AppVersionGithubIntegrationEventType)(0), // 1: zBusinessZeropsApiProtocol.AppVersionGithubIntegrationEventType - (AppVersionGitlabIntegrationEventType)(0), // 2: zBusinessZeropsApiProtocol.AppVersionGitlabIntegrationEventType - (AppVersionSource)(0), // 3: zBusinessZeropsApiProtocol.AppVersionSource - (AppVersionStatus)(0), // 4: zBusinessZeropsApiProtocol.AppVersionStatus - (ClientUserLightRoleCode)(0), // 5: zBusinessZeropsApiProtocol.ClientUserLightRoleCode - (ClientUserLightStatus)(0), // 6: zBusinessZeropsApiProtocol.ClientUserLightStatus - (GithubIntegrationEventType)(0), // 7: zBusinessZeropsApiProtocol.GithubIntegrationEventType - (GitlabIntegrationEventType)(0), // 8: zBusinessZeropsApiProtocol.GitlabIntegrationEventType - (ProcessStatus)(0), // 9: zBusinessZeropsApiProtocol.ProcessStatus - (ProjectStatus)(0), // 10: zBusinessZeropsApiProtocol.ProjectStatus - (PublicHttpRoutingDomainDnsCheckStatus)(0), // 11: zBusinessZeropsApiProtocol.PublicHttpRoutingDomainDnsCheckStatus - (PublicHttpRoutingDomainSslStatus)(0), // 12: zBusinessZeropsApiProtocol.PublicHttpRoutingDomainSslStatus - (ServicePortProtocol)(0), // 13: zBusinessZeropsApiProtocol.ServicePortProtocol - (ServicePortScheme)(0), // 14: zBusinessZeropsApiProtocol.ServicePortScheme - (ServiceStackConnectionStatus)(0), // 15: zBusinessZeropsApiProtocol.ServiceStackConnectionStatus - (ServiceStackMode)(0), // 16: zBusinessZeropsApiProtocol.ServiceStackMode - (ServiceStackStatus)(0), // 17: zBusinessZeropsApiProtocol.ServiceStackStatus - (ServiceStackTypeCategory)(0), // 18: zBusinessZeropsApiProtocol.ServiceStackTypeCategory - (UserDataType)(0), // 19: zBusinessZeropsApiProtocol.UserDataType - (UserDataVersion)(0), // 20: zBusinessZeropsApiProtocol.UserDataVersion - (UserJsonObjectType)(0), // 21: zBusinessZeropsApiProtocol.UserJsonObjectType - (UserStatus)(0), // 22: zBusinessZeropsApiProtocol.UserStatus - (*Error)(nil), // 23: zBusinessZeropsApiProtocol.Error - (*ErrorNull)(nil), // 24: zBusinessZeropsApiProtocol.ErrorNull - (*Timestamp)(nil), // 25: zBusinessZeropsApiProtocol.Timestamp - (*DeleteProjectRequest)(nil), // 26: zBusinessZeropsApiProtocol.DeleteProjectRequest - (*DeleteServiceStackRequest)(nil), // 27: zBusinessZeropsApiProtocol.DeleteServiceStackRequest - (*GetProcessRequest)(nil), // 28: zBusinessZeropsApiProtocol.GetProcessRequest - (*GetProjectsByNameRequest)(nil), // 29: zBusinessZeropsApiProtocol.GetProjectsByNameRequest - (*GetServiceStackRequest)(nil), // 30: zBusinessZeropsApiProtocol.GetServiceStackRequest - (*GetServiceStackByNameRequest)(nil), // 31: zBusinessZeropsApiProtocol.GetServiceStackByNameRequest - (*GetUserInfoRequest)(nil), // 32: zBusinessZeropsApiProtocol.GetUserInfoRequest - (*PostAppVersionRequest)(nil), // 33: zBusinessZeropsApiProtocol.PostAppVersionRequest - (*PostProjectImportRequest)(nil), // 34: zBusinessZeropsApiProtocol.PostProjectImportRequest - (*PostPublicHttpRoutingRequest)(nil), // 35: zBusinessZeropsApiProtocol.PostPublicHttpRoutingRequest - (*PostServiceStackImportRequest)(nil), // 36: zBusinessZeropsApiProtocol.PostServiceStackImportRequest - (*PostVpnRequestRequest)(nil), // 37: zBusinessZeropsApiProtocol.PostVpnRequestRequest - (*PublicHttpRoutingLocationPost)(nil), // 38: zBusinessZeropsApiProtocol.PublicHttpRoutingLocationPost - (*PutAppVersionBuildAndDeployRequest)(nil), // 39: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployRequest - (*PutAppVersionDeployRequest)(nil), // 40: zBusinessZeropsApiProtocol.PutAppVersionDeployRequest - (*PutProjectStartRequest)(nil), // 41: zBusinessZeropsApiProtocol.PutProjectStartRequest - (*PutProjectStopRequest)(nil), // 42: zBusinessZeropsApiProtocol.PutProjectStopRequest - (*PutServiceStackRestartRequest)(nil), // 43: zBusinessZeropsApiProtocol.PutServiceStackRestartRequest - (*PutServiceStackStartRequest)(nil), // 44: zBusinessZeropsApiProtocol.PutServiceStackStartRequest - (*PutServiceStackStopRequest)(nil), // 45: zBusinessZeropsApiProtocol.PutServiceStackStopRequest - (*DeleteProjectResponse)(nil), // 46: zBusinessZeropsApiProtocol.DeleteProjectResponse - (*DeleteProjectResponseDto)(nil), // 47: zBusinessZeropsApiProtocol.DeleteProjectResponseDto - (*DeleteServiceStackResponse)(nil), // 48: zBusinessZeropsApiProtocol.DeleteServiceStackResponse - (*DeleteServiceStackResponseDto)(nil), // 49: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto - (*GetProcessResponse)(nil), // 50: zBusinessZeropsApiProtocol.GetProcessResponse - (*GetProcessResponseDto)(nil), // 51: zBusinessZeropsApiProtocol.GetProcessResponseDto - (*GetProjectsByNameResponse)(nil), // 52: zBusinessZeropsApiProtocol.GetProjectsByNameResponse - (*GetProjectsByNameResponseDto)(nil), // 53: zBusinessZeropsApiProtocol.GetProjectsByNameResponseDto - (*GetServiceStackResponse)(nil), // 54: zBusinessZeropsApiProtocol.GetServiceStackResponse - (*GetServiceStackResponseDto)(nil), // 55: zBusinessZeropsApiProtocol.GetServiceStackResponseDto - (*GetServiceStackByNameResponse)(nil), // 56: zBusinessZeropsApiProtocol.GetServiceStackByNameResponse - (*GetServiceStackByNameResponseDto)(nil), // 57: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto - (*GetUserInfoResponse)(nil), // 58: zBusinessZeropsApiProtocol.GetUserInfoResponse - (*GetUserInfoResponseDto)(nil), // 59: zBusinessZeropsApiProtocol.GetUserInfoResponseDto - (*PostAppVersionResponse)(nil), // 60: zBusinessZeropsApiProtocol.PostAppVersionResponse - (*PostAppVersionResponseDto)(nil), // 61: zBusinessZeropsApiProtocol.PostAppVersionResponseDto - (*PostProjectImportResponse)(nil), // 62: zBusinessZeropsApiProtocol.PostProjectImportResponse - (*PostProjectImportResponseDto)(nil), // 63: zBusinessZeropsApiProtocol.PostProjectImportResponseDto - (*PostPublicHttpRoutingResponse)(nil), // 64: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponse - (*PostPublicHttpRoutingResponseDto)(nil), // 65: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponseDto - (*PostServiceStackImportResponse)(nil), // 66: zBusinessZeropsApiProtocol.PostServiceStackImportResponse - (*PostServiceStackImportResponseDto)(nil), // 67: zBusinessZeropsApiProtocol.PostServiceStackImportResponseDto - (*PostVpnRequestResponse)(nil), // 68: zBusinessZeropsApiProtocol.PostVpnRequestResponse - (*PostVpnRequestResponseDto)(nil), // 69: zBusinessZeropsApiProtocol.PostVpnRequestResponseDto - (*PutAppVersionBuildAndDeployResponse)(nil), // 70: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponse - (*PutAppVersionBuildAndDeployResponseDto)(nil), // 71: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto - (*PutAppVersionDeployResponse)(nil), // 72: zBusinessZeropsApiProtocol.PutAppVersionDeployResponse - (*PutAppVersionDeployResponseDto)(nil), // 73: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto - (*PutProjectStartResponse)(nil), // 74: zBusinessZeropsApiProtocol.PutProjectStartResponse - (*PutProjectStartResponseDto)(nil), // 75: zBusinessZeropsApiProtocol.PutProjectStartResponseDto - (*PutProjectStopResponse)(nil), // 76: zBusinessZeropsApiProtocol.PutProjectStopResponse - (*PutProjectStopResponseDto)(nil), // 77: zBusinessZeropsApiProtocol.PutProjectStopResponseDto - (*PutServiceStackRestartResponse)(nil), // 78: zBusinessZeropsApiProtocol.PutServiceStackRestartResponse - (*PutServiceStackRestartResponseDto)(nil), // 79: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto - (*PutServiceStackStartResponse)(nil), // 80: zBusinessZeropsApiProtocol.PutServiceStackStartResponse - (*PutServiceStackStartResponseDto)(nil), // 81: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto - (*PutServiceStackStopResponse)(nil), // 82: zBusinessZeropsApiProtocol.PutServiceStackStopResponse - (*PutServiceStackStopResponseDto)(nil), // 83: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto - (*AppVersionBuild)(nil), // 84: zBusinessZeropsApiProtocol.AppVersionBuild - (*AppVersionGithubIntegration)(nil), // 85: zBusinessZeropsApiProtocol.AppVersionGithubIntegration - (*AppVersionGitlabIntegration)(nil), // 86: zBusinessZeropsApiProtocol.AppVersionGitlabIntegration - (*AppVersionJsonObject)(nil), // 87: zBusinessZeropsApiProtocol.AppVersionJsonObject - (*AppVersionLight)(nil), // 88: zBusinessZeropsApiProtocol.AppVersionLight - (*AppVersionPublicGitSource)(nil), // 89: zBusinessZeropsApiProtocol.AppVersionPublicGitSource - (*AppVersionUserData)(nil), // 90: zBusinessZeropsApiProtocol.AppVersionUserData - (*ClientAvatar)(nil), // 91: zBusinessZeropsApiProtocol.ClientAvatar - (*ClientExtra)(nil), // 92: zBusinessZeropsApiProtocol.ClientExtra - (*ClientUserExtra)(nil), // 93: zBusinessZeropsApiProtocol.ClientUserExtra - (*CustomAutoscaling)(nil), // 94: zBusinessZeropsApiProtocol.CustomAutoscaling - (*GithubIntegration)(nil), // 95: zBusinessZeropsApiProtocol.GithubIntegration - (*GitlabIntegration)(nil), // 96: zBusinessZeropsApiProtocol.GitlabIntegration - (*HorizontalAutoscaling)(nil), // 97: zBusinessZeropsApiProtocol.HorizontalAutoscaling - (*Language)(nil), // 98: zBusinessZeropsApiProtocol.Language - (*LocationServiceStackInfo)(nil), // 99: zBusinessZeropsApiProtocol.LocationServiceStackInfo - (*PrepareCustomRuntime)(nil), // 100: zBusinessZeropsApiProtocol.PrepareCustomRuntime - (*Process)(nil), // 101: zBusinessZeropsApiProtocol.Process - (*Project)(nil), // 102: zBusinessZeropsApiProtocol.Project - (*ProjectImportServiceStack)(nil), // 103: zBusinessZeropsApiProtocol.ProjectImportServiceStack - (*ProjectLight)(nil), // 104: zBusinessZeropsApiProtocol.ProjectLight - (*ProjectLightJsonObject)(nil), // 105: zBusinessZeropsApiProtocol.ProjectLightJsonObject - (*PublicHttpRoutingDomain)(nil), // 106: zBusinessZeropsApiProtocol.PublicHttpRoutingDomain - (*PublicHttpRoutingLocation)(nil), // 107: zBusinessZeropsApiProtocol.PublicHttpRoutingLocation - (*RequestedPortsJsonObject)(nil), // 108: zBusinessZeropsApiProtocol.RequestedPortsJsonObject - (*ScalingResource)(nil), // 109: zBusinessZeropsApiProtocol.ScalingResource - (*ServicePort)(nil), // 110: zBusinessZeropsApiProtocol.ServicePort - (*ServiceStackConnectedServiceStack)(nil), // 111: zBusinessZeropsApiProtocol.ServiceStackConnectedServiceStack - (*ServiceStackInfoJsonObject)(nil), // 112: zBusinessZeropsApiProtocol.ServiceStackInfoJsonObject - (*ServiceStackLight)(nil), // 113: zBusinessZeropsApiProtocol.ServiceStackLight - (*ServiceStackLightJsonObject)(nil), // 114: zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - (*UserAvatar)(nil), // 115: zBusinessZeropsApiProtocol.UserAvatar - (*UserDataLight)(nil), // 116: zBusinessZeropsApiProtocol.UserDataLight - (*UserJsonObject)(nil), // 117: zBusinessZeropsApiProtocol.UserJsonObject - (*UserLight)(nil), // 118: zBusinessZeropsApiProtocol.UserLight - (*VerticalAutoscaling)(nil), // 119: zBusinessZeropsApiProtocol.VerticalAutoscaling - (*AppVersionBuildNull)(nil), // 120: zBusinessZeropsApiProtocol.AppVersionBuildNull - (*AppVersionGithubIntegrationNull)(nil), // 121: zBusinessZeropsApiProtocol.AppVersionGithubIntegrationNull - (*AppVersionGitlabIntegrationNull)(nil), // 122: zBusinessZeropsApiProtocol.AppVersionGitlabIntegrationNull - (*AppVersionJsonObjectNull)(nil), // 123: zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - (*AppVersionLightNull)(nil), // 124: zBusinessZeropsApiProtocol.AppVersionLightNull - (*AppVersionPublicGitSourceNull)(nil), // 125: zBusinessZeropsApiProtocol.AppVersionPublicGitSourceNull - (*ClientAvatarNull)(nil), // 126: zBusinessZeropsApiProtocol.ClientAvatarNull - (*CustomAutoscalingNull)(nil), // 127: zBusinessZeropsApiProtocol.CustomAutoscalingNull - (*GithubIntegrationNull)(nil), // 128: zBusinessZeropsApiProtocol.GithubIntegrationNull - (*GitlabIntegrationNull)(nil), // 129: zBusinessZeropsApiProtocol.GitlabIntegrationNull - (*HorizontalAutoscalingNull)(nil), // 130: zBusinessZeropsApiProtocol.HorizontalAutoscalingNull - (*Int32Null)(nil), // 131: zBusinessZeropsApiProtocol.Int32Null - (*PrepareCustomRuntimeNull)(nil), // 132: zBusinessZeropsApiProtocol.PrepareCustomRuntimeNull - (*StringNull)(nil), // 133: zBusinessZeropsApiProtocol.StringNull - (*TimestampNull)(nil), // 134: zBusinessZeropsApiProtocol.TimestampNull - (*UserAvatarNull)(nil), // 135: zBusinessZeropsApiProtocol.UserAvatarNull - (*UserJsonObjectNull)(nil), // 136: zBusinessZeropsApiProtocol.UserJsonObjectNull - (*VerticalAutoscalingNull)(nil), // 137: zBusinessZeropsApiProtocol.VerticalAutoscalingNull -} -var file_zeropsApiProtocol_proto_depIdxs = []int32{ - 0, // 0: zBusinessZeropsApiProtocol.Error.code:type_name -> zBusinessZeropsApiProtocol.ErrorCode - 23, // 1: zBusinessZeropsApiProtocol.ErrorNull.value:type_name -> zBusinessZeropsApiProtocol.Error - 133, // 2: zBusinessZeropsApiProtocol.PostAppVersionRequest.name:type_name -> zBusinessZeropsApiProtocol.StringNull - 38, // 3: zBusinessZeropsApiProtocol.PostPublicHttpRoutingRequest.locations:type_name -> zBusinessZeropsApiProtocol.PublicHttpRoutingLocationPost - 133, // 4: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployRequest.source:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 5: zBusinessZeropsApiProtocol.PutAppVersionDeployRequest.configContent:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 6: zBusinessZeropsApiProtocol.PutAppVersionDeployRequest.source:type_name -> zBusinessZeropsApiProtocol.StringNull - 23, // 7: zBusinessZeropsApiProtocol.DeleteProjectResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 47, // 8: zBusinessZeropsApiProtocol.DeleteProjectResponse.output:type_name -> zBusinessZeropsApiProtocol.DeleteProjectResponseDto - 133, // 9: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 10: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 11: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 12: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 13: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 14: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 15: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 16: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 17: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 18: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 19: zBusinessZeropsApiProtocol.DeleteProjectResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 20: zBusinessZeropsApiProtocol.DeleteServiceStackResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 49, // 21: zBusinessZeropsApiProtocol.DeleteServiceStackResponse.output:type_name -> zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto - 133, // 22: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 23: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 24: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 25: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 26: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 27: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 28: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 29: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 30: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 31: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 32: zBusinessZeropsApiProtocol.DeleteServiceStackResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 33: zBusinessZeropsApiProtocol.GetProcessResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 51, // 34: zBusinessZeropsApiProtocol.GetProcessResponse.output:type_name -> zBusinessZeropsApiProtocol.GetProcessResponseDto - 133, // 35: zBusinessZeropsApiProtocol.GetProcessResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 36: zBusinessZeropsApiProtocol.GetProcessResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 37: zBusinessZeropsApiProtocol.GetProcessResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 38: zBusinessZeropsApiProtocol.GetProcessResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 39: zBusinessZeropsApiProtocol.GetProcessResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 40: zBusinessZeropsApiProtocol.GetProcessResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 41: zBusinessZeropsApiProtocol.GetProcessResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 42: zBusinessZeropsApiProtocol.GetProcessResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 43: zBusinessZeropsApiProtocol.GetProcessResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 44: zBusinessZeropsApiProtocol.GetProcessResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 45: zBusinessZeropsApiProtocol.GetProcessResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 46: zBusinessZeropsApiProtocol.GetProjectsByNameResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 53, // 47: zBusinessZeropsApiProtocol.GetProjectsByNameResponse.output:type_name -> zBusinessZeropsApiProtocol.GetProjectsByNameResponseDto - 102, // 48: zBusinessZeropsApiProtocol.GetProjectsByNameResponseDto.projects:type_name -> zBusinessZeropsApiProtocol.Project - 23, // 49: zBusinessZeropsApiProtocol.GetServiceStackResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 55, // 50: zBusinessZeropsApiProtocol.GetServiceStackResponse.output:type_name -> zBusinessZeropsApiProtocol.GetServiceStackResponseDto - 17, // 51: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ServiceStackStatus - 112, // 52: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.serviceStackTypeInfo:type_name -> zBusinessZeropsApiProtocol.ServiceStackInfoJsonObject - 128, // 53: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.githubIntegration:type_name -> zBusinessZeropsApiProtocol.GithubIntegrationNull - 129, // 54: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.gitlabIntegration:type_name -> zBusinessZeropsApiProtocol.GitlabIntegrationNull - 127, // 55: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.customAutoscaling:type_name -> zBusinessZeropsApiProtocol.CustomAutoscalingNull - 110, // 56: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.ports:type_name -> zBusinessZeropsApiProtocol.ServicePort - 108, // 57: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.requestedPorts:type_name -> zBusinessZeropsApiProtocol.RequestedPortsJsonObject - 25, // 58: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 59: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 16, // 60: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.mode:type_name -> zBusinessZeropsApiProtocol.ServiceStackMode - 104, // 61: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLight - 111, // 62: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.connectedStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackConnectedServiceStack - 116, // 63: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.userData:type_name -> zBusinessZeropsApiProtocol.UserDataLight - 124, // 64: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.activeAppVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionLightNull - 131, // 65: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.activePublicHttpRoutingCount:type_name -> zBusinessZeropsApiProtocol.Int32Null - 131, // 66: zBusinessZeropsApiProtocol.GetServiceStackResponseDto.activePublicPortRoutingCount:type_name -> zBusinessZeropsApiProtocol.Int32Null - 23, // 67: zBusinessZeropsApiProtocol.GetServiceStackByNameResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 57, // 68: zBusinessZeropsApiProtocol.GetServiceStackByNameResponse.output:type_name -> zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto - 17, // 69: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ServiceStackStatus - 112, // 70: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.serviceStackTypeInfo:type_name -> zBusinessZeropsApiProtocol.ServiceStackInfoJsonObject - 128, // 71: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.githubIntegration:type_name -> zBusinessZeropsApiProtocol.GithubIntegrationNull - 129, // 72: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.gitlabIntegration:type_name -> zBusinessZeropsApiProtocol.GitlabIntegrationNull - 127, // 73: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.customAutoscaling:type_name -> zBusinessZeropsApiProtocol.CustomAutoscalingNull - 110, // 74: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.ports:type_name -> zBusinessZeropsApiProtocol.ServicePort - 108, // 75: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.requestedPorts:type_name -> zBusinessZeropsApiProtocol.RequestedPortsJsonObject - 25, // 76: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 77: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 16, // 78: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.mode:type_name -> zBusinessZeropsApiProtocol.ServiceStackMode - 104, // 79: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLight - 111, // 80: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.connectedStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackConnectedServiceStack - 116, // 81: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.userData:type_name -> zBusinessZeropsApiProtocol.UserDataLight - 124, // 82: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.activeAppVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionLightNull - 131, // 83: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.activePublicHttpRoutingCount:type_name -> zBusinessZeropsApiProtocol.Int32Null - 131, // 84: zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto.activePublicPortRoutingCount:type_name -> zBusinessZeropsApiProtocol.Int32Null - 23, // 85: zBusinessZeropsApiProtocol.GetUserInfoResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 59, // 86: zBusinessZeropsApiProtocol.GetUserInfoResponse.output:type_name -> zBusinessZeropsApiProtocol.GetUserInfoResponseDto - 135, // 87: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.avatar:type_name -> zBusinessZeropsApiProtocol.UserAvatarNull - 131, // 88: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.countryCallingCode:type_name -> zBusinessZeropsApiProtocol.Int32Null - 131, // 89: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.phoneNumber:type_name -> zBusinessZeropsApiProtocol.Int32Null - 98, // 90: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.language:type_name -> zBusinessZeropsApiProtocol.Language - 25, // 91: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 92: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 22, // 93: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.status:type_name -> zBusinessZeropsApiProtocol.UserStatus - 93, // 94: zBusinessZeropsApiProtocol.GetUserInfoResponseDto.clientUserList:type_name -> zBusinessZeropsApiProtocol.ClientUserExtra - 23, // 95: zBusinessZeropsApiProtocol.PostAppVersionResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 61, // 96: zBusinessZeropsApiProtocol.PostAppVersionResponse.output:type_name -> zBusinessZeropsApiProtocol.PostAppVersionResponseDto - 120, // 97: zBusinessZeropsApiProtocol.PostAppVersionResponseDto.build:type_name -> zBusinessZeropsApiProtocol.AppVersionBuildNull - 4, // 98: zBusinessZeropsApiProtocol.PostAppVersionResponseDto.status:type_name -> zBusinessZeropsApiProtocol.AppVersionStatus - 90, // 99: zBusinessZeropsApiProtocol.PostAppVersionResponseDto.userDataList:type_name -> zBusinessZeropsApiProtocol.AppVersionUserData - 25, // 100: zBusinessZeropsApiProtocol.PostAppVersionResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 101: zBusinessZeropsApiProtocol.PostAppVersionResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 23, // 102: zBusinessZeropsApiProtocol.PostProjectImportResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 63, // 103: zBusinessZeropsApiProtocol.PostProjectImportResponse.output:type_name -> zBusinessZeropsApiProtocol.PostProjectImportResponseDto - 103, // 104: zBusinessZeropsApiProtocol.PostProjectImportResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ProjectImportServiceStack - 23, // 105: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 65, // 106: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponse.output:type_name -> zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponseDto - 106, // 107: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponseDto.domains:type_name -> zBusinessZeropsApiProtocol.PublicHttpRoutingDomain - 107, // 108: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponseDto.locations:type_name -> zBusinessZeropsApiProtocol.PublicHttpRoutingLocation - 25, // 109: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 110: zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 23, // 111: zBusinessZeropsApiProtocol.PostServiceStackImportResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 67, // 112: zBusinessZeropsApiProtocol.PostServiceStackImportResponse.output:type_name -> zBusinessZeropsApiProtocol.PostServiceStackImportResponseDto - 103, // 113: zBusinessZeropsApiProtocol.PostServiceStackImportResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ProjectImportServiceStack - 23, // 114: zBusinessZeropsApiProtocol.PostVpnRequestResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 69, // 115: zBusinessZeropsApiProtocol.PostVpnRequestResponse.output:type_name -> zBusinessZeropsApiProtocol.PostVpnRequestResponseDto - 25, // 116: zBusinessZeropsApiProtocol.PostVpnRequestResponseDto.expiry:type_name -> zBusinessZeropsApiProtocol.Timestamp - 23, // 117: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 71, // 118: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponse.output:type_name -> zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto - 133, // 119: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 120: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 121: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 122: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 123: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 124: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 125: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 126: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 127: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 128: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 129: zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 130: zBusinessZeropsApiProtocol.PutAppVersionDeployResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 73, // 131: zBusinessZeropsApiProtocol.PutAppVersionDeployResponse.output:type_name -> zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto - 133, // 132: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 133: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 134: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 135: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 136: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 137: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 138: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 139: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 140: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 141: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 142: zBusinessZeropsApiProtocol.PutAppVersionDeployResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 143: zBusinessZeropsApiProtocol.PutProjectStartResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 75, // 144: zBusinessZeropsApiProtocol.PutProjectStartResponse.output:type_name -> zBusinessZeropsApiProtocol.PutProjectStartResponseDto - 133, // 145: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 146: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 147: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 148: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 149: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 150: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 151: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 152: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 153: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 154: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 155: zBusinessZeropsApiProtocol.PutProjectStartResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 156: zBusinessZeropsApiProtocol.PutProjectStopResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 77, // 157: zBusinessZeropsApiProtocol.PutProjectStopResponse.output:type_name -> zBusinessZeropsApiProtocol.PutProjectStopResponseDto - 133, // 158: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 159: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 160: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 161: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 162: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 163: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 164: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 165: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 166: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 167: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 168: zBusinessZeropsApiProtocol.PutProjectStopResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 169: zBusinessZeropsApiProtocol.PutServiceStackRestartResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 79, // 170: zBusinessZeropsApiProtocol.PutServiceStackRestartResponse.output:type_name -> zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto - 133, // 171: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 172: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 173: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 174: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 175: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 176: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 177: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 178: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 179: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 180: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 181: zBusinessZeropsApiProtocol.PutServiceStackRestartResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 182: zBusinessZeropsApiProtocol.PutServiceStackStartResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 81, // 183: zBusinessZeropsApiProtocol.PutServiceStackStartResponse.output:type_name -> zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto - 133, // 184: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 185: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 186: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 187: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 188: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 189: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 190: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 191: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 192: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 193: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 194: zBusinessZeropsApiProtocol.PutServiceStackStartResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 23, // 195: zBusinessZeropsApiProtocol.PutServiceStackStopResponse.error:type_name -> zBusinessZeropsApiProtocol.Error - 83, // 196: zBusinessZeropsApiProtocol.PutServiceStackStopResponse.output:type_name -> zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto - 133, // 197: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 198: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 199: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 200: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 201: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 202: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 203: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 204: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 205: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 206: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 207: zBusinessZeropsApiProtocol.PutServiceStackStopResponseDto.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 133, // 208: zBusinessZeropsApiProtocol.AppVersionBuild.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 209: zBusinessZeropsApiProtocol.AppVersionBuild.serviceStackName:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 210: zBusinessZeropsApiProtocol.AppVersionBuild.serviceStackTypeVersionId:type_name -> zBusinessZeropsApiProtocol.StringNull - 134, // 211: zBusinessZeropsApiProtocol.AppVersionBuild.pipelineStart:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 212: zBusinessZeropsApiProtocol.AppVersionBuild.pipelineFinish:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 213: zBusinessZeropsApiProtocol.AppVersionBuild.pipelineFailed:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 214: zBusinessZeropsApiProtocol.AppVersionBuild.containerCreationStart:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 215: zBusinessZeropsApiProtocol.AppVersionBuild.startDate:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 216: zBusinessZeropsApiProtocol.AppVersionBuild.endDate:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 1, // 217: zBusinessZeropsApiProtocol.AppVersionGithubIntegration.eventType:type_name -> zBusinessZeropsApiProtocol.AppVersionGithubIntegrationEventType - 133, // 218: zBusinessZeropsApiProtocol.AppVersionGithubIntegration.branchName:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 219: zBusinessZeropsApiProtocol.AppVersionGithubIntegration.tagName:type_name -> zBusinessZeropsApiProtocol.StringNull - 2, // 220: zBusinessZeropsApiProtocol.AppVersionGitlabIntegration.eventType:type_name -> zBusinessZeropsApiProtocol.AppVersionGitlabIntegrationEventType - 133, // 221: zBusinessZeropsApiProtocol.AppVersionGitlabIntegration.branchName:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 222: zBusinessZeropsApiProtocol.AppVersionGitlabIntegration.tagName:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 223: zBusinessZeropsApiProtocol.AppVersionJsonObject.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 224: zBusinessZeropsApiProtocol.AppVersionJsonObject.projectId:type_name -> zBusinessZeropsApiProtocol.StringNull - 4, // 225: zBusinessZeropsApiProtocol.AppVersionJsonObject.status:type_name -> zBusinessZeropsApiProtocol.AppVersionStatus - 3, // 226: zBusinessZeropsApiProtocol.AppVersionJsonObject.source:type_name -> zBusinessZeropsApiProtocol.AppVersionSource - 133, // 227: zBusinessZeropsApiProtocol.AppVersionJsonObject.name:type_name -> zBusinessZeropsApiProtocol.StringNull - 134, // 228: zBusinessZeropsApiProtocol.AppVersionJsonObject.created:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 120, // 229: zBusinessZeropsApiProtocol.AppVersionJsonObject.build:type_name -> zBusinessZeropsApiProtocol.AppVersionBuildNull - 132, // 230: zBusinessZeropsApiProtocol.AppVersionJsonObject.prepareCustomRuntime:type_name -> zBusinessZeropsApiProtocol.PrepareCustomRuntimeNull - 121, // 231: zBusinessZeropsApiProtocol.AppVersionJsonObject.githubIntegration:type_name -> zBusinessZeropsApiProtocol.AppVersionGithubIntegrationNull - 122, // 232: zBusinessZeropsApiProtocol.AppVersionJsonObject.gitlabIntegration:type_name -> zBusinessZeropsApiProtocol.AppVersionGitlabIntegrationNull - 136, // 233: zBusinessZeropsApiProtocol.AppVersionJsonObject.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 134, // 234: zBusinessZeropsApiProtocol.AppVersionJsonObject.activationDate:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 125, // 235: zBusinessZeropsApiProtocol.AppVersionJsonObject.publicGitSource:type_name -> zBusinessZeropsApiProtocol.AppVersionPublicGitSourceNull - 133, // 236: zBusinessZeropsApiProtocol.AppVersionJsonObject.configContent:type_name -> zBusinessZeropsApiProtocol.StringNull - 4, // 237: zBusinessZeropsApiProtocol.AppVersionLight.status:type_name -> zBusinessZeropsApiProtocol.AppVersionStatus - 25, // 238: zBusinessZeropsApiProtocol.AppVersionLight.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 239: zBusinessZeropsApiProtocol.AppVersionLight.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 19, // 240: zBusinessZeropsApiProtocol.AppVersionUserData.type:type_name -> zBusinessZeropsApiProtocol.UserDataType - 133, // 241: zBusinessZeropsApiProtocol.ClientAvatar.largeAvatarUrl:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 242: zBusinessZeropsApiProtocol.ClientAvatar.smallAvatarUrl:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 243: zBusinessZeropsApiProtocol.ClientAvatar.externalAvatarUrl:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 244: zBusinessZeropsApiProtocol.ClientExtra.companyNumber:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 245: zBusinessZeropsApiProtocol.ClientExtra.vatNumber:type_name -> zBusinessZeropsApiProtocol.StringNull - 126, // 246: zBusinessZeropsApiProtocol.ClientExtra.avatar:type_name -> zBusinessZeropsApiProtocol.ClientAvatarNull - 6, // 247: zBusinessZeropsApiProtocol.ClientUserExtra.status:type_name -> zBusinessZeropsApiProtocol.ClientUserLightStatus - 5, // 248: zBusinessZeropsApiProtocol.ClientUserExtra.roleCode:type_name -> zBusinessZeropsApiProtocol.ClientUserLightRoleCode - 92, // 249: zBusinessZeropsApiProtocol.ClientUserExtra.client:type_name -> zBusinessZeropsApiProtocol.ClientExtra - 118, // 250: zBusinessZeropsApiProtocol.ClientUserExtra.user:type_name -> zBusinessZeropsApiProtocol.UserLight - 137, // 251: zBusinessZeropsApiProtocol.CustomAutoscaling.verticalAutoscaling:type_name -> zBusinessZeropsApiProtocol.VerticalAutoscalingNull - 130, // 252: zBusinessZeropsApiProtocol.CustomAutoscaling.horizontalAutoscaling:type_name -> zBusinessZeropsApiProtocol.HorizontalAutoscalingNull - 133, // 253: zBusinessZeropsApiProtocol.GithubIntegration.branchName:type_name -> zBusinessZeropsApiProtocol.StringNull - 7, // 254: zBusinessZeropsApiProtocol.GithubIntegration.eventType:type_name -> zBusinessZeropsApiProtocol.GithubIntegrationEventType - 131, // 255: zBusinessZeropsApiProtocol.GithubIntegration.webhookId:type_name -> zBusinessZeropsApiProtocol.Int32Null - 133, // 256: zBusinessZeropsApiProtocol.GitlabIntegration.branchName:type_name -> zBusinessZeropsApiProtocol.StringNull - 8, // 257: zBusinessZeropsApiProtocol.GitlabIntegration.eventType:type_name -> zBusinessZeropsApiProtocol.GitlabIntegrationEventType - 131, // 258: zBusinessZeropsApiProtocol.GitlabIntegration.webhookId:type_name -> zBusinessZeropsApiProtocol.Int32Null - 134, // 259: zBusinessZeropsApiProtocol.PrepareCustomRuntime.containerCreationStart:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 260: zBusinessZeropsApiProtocol.PrepareCustomRuntime.startDate:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 261: zBusinessZeropsApiProtocol.PrepareCustomRuntime.endDate:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 133, // 262: zBusinessZeropsApiProtocol.PrepareCustomRuntime.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 263: zBusinessZeropsApiProtocol.PrepareCustomRuntime.serviceStackName:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 264: zBusinessZeropsApiProtocol.Process.serviceStackId:type_name -> zBusinessZeropsApiProtocol.StringNull - 105, // 265: zBusinessZeropsApiProtocol.Process.project:type_name -> zBusinessZeropsApiProtocol.ProjectLightJsonObject - 114, // 266: zBusinessZeropsApiProtocol.Process.serviceStacks:type_name -> zBusinessZeropsApiProtocol.ServiceStackLightJsonObject - 9, // 267: zBusinessZeropsApiProtocol.Process.status:type_name -> zBusinessZeropsApiProtocol.ProcessStatus - 117, // 268: zBusinessZeropsApiProtocol.Process.createdByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 136, // 269: zBusinessZeropsApiProtocol.Process.canceledByUser:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectNull - 25, // 270: zBusinessZeropsApiProtocol.Process.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 271: zBusinessZeropsApiProtocol.Process.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 134, // 272: zBusinessZeropsApiProtocol.Process.started:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 134, // 273: zBusinessZeropsApiProtocol.Process.finished:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 123, // 274: zBusinessZeropsApiProtocol.Process.appVersion:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObjectNull - 133, // 275: zBusinessZeropsApiProtocol.Project.description:type_name -> zBusinessZeropsApiProtocol.StringNull - 10, // 276: zBusinessZeropsApiProtocol.Project.status:type_name -> zBusinessZeropsApiProtocol.ProjectStatus - 25, // 277: zBusinessZeropsApiProtocol.Project.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 278: zBusinessZeropsApiProtocol.Project.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 133, // 279: zBusinessZeropsApiProtocol.Project.publicIpV4:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 280: zBusinessZeropsApiProtocol.Project.publicIpV6:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 281: zBusinessZeropsApiProtocol.Project.zeropsSubdomainHost:type_name -> zBusinessZeropsApiProtocol.StringNull - 24, // 282: zBusinessZeropsApiProtocol.ProjectImportServiceStack.error:type_name -> zBusinessZeropsApiProtocol.ErrorNull - 101, // 283: zBusinessZeropsApiProtocol.ProjectImportServiceStack.processes:type_name -> zBusinessZeropsApiProtocol.Process - 133, // 284: zBusinessZeropsApiProtocol.ProjectLight.description:type_name -> zBusinessZeropsApiProtocol.StringNull - 10, // 285: zBusinessZeropsApiProtocol.ProjectLight.status:type_name -> zBusinessZeropsApiProtocol.ProjectStatus - 25, // 286: zBusinessZeropsApiProtocol.ProjectLight.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 287: zBusinessZeropsApiProtocol.ProjectLight.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 133, // 288: zBusinessZeropsApiProtocol.ProjectLightJsonObject.description:type_name -> zBusinessZeropsApiProtocol.StringNull - 10, // 289: zBusinessZeropsApiProtocol.ProjectLightJsonObject.status:type_name -> zBusinessZeropsApiProtocol.ProjectStatus - 25, // 290: zBusinessZeropsApiProtocol.ProjectLightJsonObject.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 291: zBusinessZeropsApiProtocol.ProjectLightJsonObject.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 11, // 292: zBusinessZeropsApiProtocol.PublicHttpRoutingDomain.dnsCheckStatus:type_name -> zBusinessZeropsApiProtocol.PublicHttpRoutingDomainDnsCheckStatus - 12, // 293: zBusinessZeropsApiProtocol.PublicHttpRoutingDomain.sslStatus:type_name -> zBusinessZeropsApiProtocol.PublicHttpRoutingDomainSslStatus - 99, // 294: zBusinessZeropsApiProtocol.PublicHttpRoutingLocation.serviceStackInfo:type_name -> zBusinessZeropsApiProtocol.LocationServiceStackInfo - 110, // 295: zBusinessZeropsApiProtocol.RequestedPortsJsonObject.requestedPorts:type_name -> zBusinessZeropsApiProtocol.ServicePort - 13, // 296: zBusinessZeropsApiProtocol.ServicePort.protocol:type_name -> zBusinessZeropsApiProtocol.ServicePortProtocol - 14, // 297: zBusinessZeropsApiProtocol.ServicePort.scheme:type_name -> zBusinessZeropsApiProtocol.ServicePortScheme - 133, // 298: zBusinessZeropsApiProtocol.ServicePort.serviceId:type_name -> zBusinessZeropsApiProtocol.StringNull - 113, // 299: zBusinessZeropsApiProtocol.ServiceStackConnectedServiceStack.serviceStack:type_name -> zBusinessZeropsApiProtocol.ServiceStackLight - 15, // 300: zBusinessZeropsApiProtocol.ServiceStackConnectedServiceStack.status:type_name -> zBusinessZeropsApiProtocol.ServiceStackConnectionStatus - 18, // 301: zBusinessZeropsApiProtocol.ServiceStackInfoJsonObject.serviceStackTypeCategory:type_name -> zBusinessZeropsApiProtocol.ServiceStackTypeCategory - 17, // 302: zBusinessZeropsApiProtocol.ServiceStackLight.status:type_name -> zBusinessZeropsApiProtocol.ServiceStackStatus - 112, // 303: zBusinessZeropsApiProtocol.ServiceStackLight.serviceStackTypeInfo:type_name -> zBusinessZeropsApiProtocol.ServiceStackInfoJsonObject - 128, // 304: zBusinessZeropsApiProtocol.ServiceStackLight.githubIntegration:type_name -> zBusinessZeropsApiProtocol.GithubIntegrationNull - 129, // 305: zBusinessZeropsApiProtocol.ServiceStackLight.gitlabIntegration:type_name -> zBusinessZeropsApiProtocol.GitlabIntegrationNull - 127, // 306: zBusinessZeropsApiProtocol.ServiceStackLight.customAutoscaling:type_name -> zBusinessZeropsApiProtocol.CustomAutoscalingNull - 25, // 307: zBusinessZeropsApiProtocol.ServiceStackLightJsonObject.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 308: zBusinessZeropsApiProtocol.ServiceStackLightJsonObject.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 133, // 309: zBusinessZeropsApiProtocol.ServiceStackLightJsonObject.driverId:type_name -> zBusinessZeropsApiProtocol.StringNull - 112, // 310: zBusinessZeropsApiProtocol.ServiceStackLightJsonObject.serviceStackTypeInfo:type_name -> zBusinessZeropsApiProtocol.ServiceStackInfoJsonObject - 110, // 311: zBusinessZeropsApiProtocol.ServiceStackLightJsonObject.ports:type_name -> zBusinessZeropsApiProtocol.ServicePort - 133, // 312: zBusinessZeropsApiProtocol.UserAvatar.largeAvatarUrl:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 313: zBusinessZeropsApiProtocol.UserAvatar.smallAvatarUrl:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 314: zBusinessZeropsApiProtocol.UserAvatar.externalAvatarUrl:type_name -> zBusinessZeropsApiProtocol.StringNull - 19, // 315: zBusinessZeropsApiProtocol.UserDataLight.type:type_name -> zBusinessZeropsApiProtocol.UserDataType - 25, // 316: zBusinessZeropsApiProtocol.UserDataLight.created:type_name -> zBusinessZeropsApiProtocol.Timestamp - 25, // 317: zBusinessZeropsApiProtocol.UserDataLight.lastUpdate:type_name -> zBusinessZeropsApiProtocol.Timestamp - 20, // 318: zBusinessZeropsApiProtocol.UserDataLight.version:type_name -> zBusinessZeropsApiProtocol.UserDataVersion - 134, // 319: zBusinessZeropsApiProtocol.UserDataLight.lastSync:type_name -> zBusinessZeropsApiProtocol.TimestampNull - 21, // 320: zBusinessZeropsApiProtocol.UserJsonObject.type:type_name -> zBusinessZeropsApiProtocol.UserJsonObjectType - 133, // 321: zBusinessZeropsApiProtocol.UserJsonObject.id:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 322: zBusinessZeropsApiProtocol.UserJsonObject.email:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 323: zBusinessZeropsApiProtocol.UserJsonObject.firstName:type_name -> zBusinessZeropsApiProtocol.StringNull - 133, // 324: zBusinessZeropsApiProtocol.UserJsonObject.fullName:type_name -> zBusinessZeropsApiProtocol.StringNull - 135, // 325: zBusinessZeropsApiProtocol.UserJsonObject.avatar:type_name -> zBusinessZeropsApiProtocol.UserAvatarNull - 135, // 326: zBusinessZeropsApiProtocol.UserLight.avatar:type_name -> zBusinessZeropsApiProtocol.UserAvatarNull - 109, // 327: zBusinessZeropsApiProtocol.VerticalAutoscaling.maxResource:type_name -> zBusinessZeropsApiProtocol.ScalingResource - 109, // 328: zBusinessZeropsApiProtocol.VerticalAutoscaling.minResource:type_name -> zBusinessZeropsApiProtocol.ScalingResource - 84, // 329: zBusinessZeropsApiProtocol.AppVersionBuildNull.value:type_name -> zBusinessZeropsApiProtocol.AppVersionBuild - 85, // 330: zBusinessZeropsApiProtocol.AppVersionGithubIntegrationNull.value:type_name -> zBusinessZeropsApiProtocol.AppVersionGithubIntegration - 86, // 331: zBusinessZeropsApiProtocol.AppVersionGitlabIntegrationNull.value:type_name -> zBusinessZeropsApiProtocol.AppVersionGitlabIntegration - 87, // 332: zBusinessZeropsApiProtocol.AppVersionJsonObjectNull.value:type_name -> zBusinessZeropsApiProtocol.AppVersionJsonObject - 88, // 333: zBusinessZeropsApiProtocol.AppVersionLightNull.value:type_name -> zBusinessZeropsApiProtocol.AppVersionLight - 89, // 334: zBusinessZeropsApiProtocol.AppVersionPublicGitSourceNull.value:type_name -> zBusinessZeropsApiProtocol.AppVersionPublicGitSource - 91, // 335: zBusinessZeropsApiProtocol.ClientAvatarNull.value:type_name -> zBusinessZeropsApiProtocol.ClientAvatar - 94, // 336: zBusinessZeropsApiProtocol.CustomAutoscalingNull.value:type_name -> zBusinessZeropsApiProtocol.CustomAutoscaling - 95, // 337: zBusinessZeropsApiProtocol.GithubIntegrationNull.value:type_name -> zBusinessZeropsApiProtocol.GithubIntegration - 96, // 338: zBusinessZeropsApiProtocol.GitlabIntegrationNull.value:type_name -> zBusinessZeropsApiProtocol.GitlabIntegration - 97, // 339: zBusinessZeropsApiProtocol.HorizontalAutoscalingNull.value:type_name -> zBusinessZeropsApiProtocol.HorizontalAutoscaling - 100, // 340: zBusinessZeropsApiProtocol.PrepareCustomRuntimeNull.value:type_name -> zBusinessZeropsApiProtocol.PrepareCustomRuntime - 25, // 341: zBusinessZeropsApiProtocol.TimestampNull.value:type_name -> zBusinessZeropsApiProtocol.Timestamp - 115, // 342: zBusinessZeropsApiProtocol.UserAvatarNull.value:type_name -> zBusinessZeropsApiProtocol.UserAvatar - 117, // 343: zBusinessZeropsApiProtocol.UserJsonObjectNull.value:type_name -> zBusinessZeropsApiProtocol.UserJsonObject - 119, // 344: zBusinessZeropsApiProtocol.VerticalAutoscalingNull.value:type_name -> zBusinessZeropsApiProtocol.VerticalAutoscaling - 40, // 345: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutAppVersionDeploy:input_type -> zBusinessZeropsApiProtocol.PutAppVersionDeployRequest - 39, // 346: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutAppVersionBuildAndDeploy:input_type -> zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployRequest - 33, // 347: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostAppVersion:input_type -> zBusinessZeropsApiProtocol.PostAppVersionRequest - 26, // 348: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.DeleteProject:input_type -> zBusinessZeropsApiProtocol.DeleteProjectRequest - 29, // 349: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetProjectsByName:input_type -> zBusinessZeropsApiProtocol.GetProjectsByNameRequest - 41, // 350: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutProjectStart:input_type -> zBusinessZeropsApiProtocol.PutProjectStartRequest - 42, // 351: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutProjectStop:input_type -> zBusinessZeropsApiProtocol.PutProjectStopRequest - 34, // 352: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostProjectImport:input_type -> zBusinessZeropsApiProtocol.PostProjectImportRequest - 28, // 353: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetProcess:input_type -> zBusinessZeropsApiProtocol.GetProcessRequest - 35, // 354: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostPublicHttpRouting:input_type -> zBusinessZeropsApiProtocol.PostPublicHttpRoutingRequest - 30, // 355: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetServiceStack:input_type -> zBusinessZeropsApiProtocol.GetServiceStackRequest - 27, // 356: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.DeleteServiceStack:input_type -> zBusinessZeropsApiProtocol.DeleteServiceStackRequest - 45, // 357: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutServiceStackStop:input_type -> zBusinessZeropsApiProtocol.PutServiceStackStopRequest - 44, // 358: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutServiceStackStart:input_type -> zBusinessZeropsApiProtocol.PutServiceStackStartRequest - 43, // 359: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutServiceStackRestart:input_type -> zBusinessZeropsApiProtocol.PutServiceStackRestartRequest - 31, // 360: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetServiceStackByName:input_type -> zBusinessZeropsApiProtocol.GetServiceStackByNameRequest - 36, // 361: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostServiceStackImport:input_type -> zBusinessZeropsApiProtocol.PostServiceStackImportRequest - 32, // 362: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetUserInfo:input_type -> zBusinessZeropsApiProtocol.GetUserInfoRequest - 37, // 363: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostVpnRequest:input_type -> zBusinessZeropsApiProtocol.PostVpnRequestRequest - 72, // 364: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutAppVersionDeploy:output_type -> zBusinessZeropsApiProtocol.PutAppVersionDeployResponse - 70, // 365: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutAppVersionBuildAndDeploy:output_type -> zBusinessZeropsApiProtocol.PutAppVersionBuildAndDeployResponse - 60, // 366: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostAppVersion:output_type -> zBusinessZeropsApiProtocol.PostAppVersionResponse - 46, // 367: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.DeleteProject:output_type -> zBusinessZeropsApiProtocol.DeleteProjectResponse - 52, // 368: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetProjectsByName:output_type -> zBusinessZeropsApiProtocol.GetProjectsByNameResponse - 74, // 369: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutProjectStart:output_type -> zBusinessZeropsApiProtocol.PutProjectStartResponse - 76, // 370: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutProjectStop:output_type -> zBusinessZeropsApiProtocol.PutProjectStopResponse - 62, // 371: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostProjectImport:output_type -> zBusinessZeropsApiProtocol.PostProjectImportResponse - 50, // 372: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetProcess:output_type -> zBusinessZeropsApiProtocol.GetProcessResponse - 64, // 373: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostPublicHttpRouting:output_type -> zBusinessZeropsApiProtocol.PostPublicHttpRoutingResponse - 54, // 374: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetServiceStack:output_type -> zBusinessZeropsApiProtocol.GetServiceStackResponse - 48, // 375: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.DeleteServiceStack:output_type -> zBusinessZeropsApiProtocol.DeleteServiceStackResponse - 82, // 376: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutServiceStackStop:output_type -> zBusinessZeropsApiProtocol.PutServiceStackStopResponse - 80, // 377: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutServiceStackStart:output_type -> zBusinessZeropsApiProtocol.PutServiceStackStartResponse - 78, // 378: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PutServiceStackRestart:output_type -> zBusinessZeropsApiProtocol.PutServiceStackRestartResponse - 56, // 379: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetServiceStackByName:output_type -> zBusinessZeropsApiProtocol.GetServiceStackByNameResponse - 66, // 380: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostServiceStackImport:output_type -> zBusinessZeropsApiProtocol.PostServiceStackImportResponse - 58, // 381: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.GetUserInfo:output_type -> zBusinessZeropsApiProtocol.GetUserInfoResponse - 68, // 382: zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol.PostVpnRequest:output_type -> zBusinessZeropsApiProtocol.PostVpnRequestResponse - 364, // [364:383] is the sub-list for method output_type - 345, // [345:364] is the sub-list for method input_type - 345, // [345:345] is the sub-list for extension type_name - 345, // [345:345] is the sub-list for extension extendee - 0, // [0:345] is the sub-list for field type_name -} - -func init() { file_zeropsApiProtocol_proto_init() } -func file_zeropsApiProtocol_proto_init() { - if File_zeropsApiProtocol_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_zeropsApiProtocol_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Timestamp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProjectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteServiceStackRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProcessRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProjectsByNameRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServiceStackRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServiceStackByNameRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUserInfoRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostAppVersionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostProjectImportRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostPublicHttpRoutingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostServiceStackImportRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostVpnRequestRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublicHttpRoutingLocationPost); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutAppVersionBuildAndDeployRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutAppVersionDeployRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProjectStartRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProjectStopRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackRestartRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackStartRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackStopRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProjectResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteProjectResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteServiceStackResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteServiceStackResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProcessResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProcessResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProjectsByNameResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProjectsByNameResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServiceStackResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServiceStackResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServiceStackByNameResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServiceStackByNameResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUserInfoResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUserInfoResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostAppVersionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostAppVersionResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostProjectImportResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostProjectImportResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostPublicHttpRoutingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostPublicHttpRoutingResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostServiceStackImportResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostServiceStackImportResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostVpnRequestResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostVpnRequestResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutAppVersionBuildAndDeployResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutAppVersionBuildAndDeployResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutAppVersionDeployResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutAppVersionDeployResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProjectStartResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProjectStartResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProjectStopResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutProjectStopResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackRestartResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackRestartResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackStartResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackStartResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackStopResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PutServiceStackStopResponseDto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionBuild); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionGithubIntegration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionGitlabIntegration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionJsonObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionLight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionPublicGitSource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionUserData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientAvatar); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientExtra); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientUserExtra); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CustomAutoscaling); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GithubIntegration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GitlabIntegration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HorizontalAutoscaling); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Language); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocationServiceStackInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrepareCustomRuntime); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Process); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Project); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProjectImportServiceStack); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProjectLight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProjectLightJsonObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublicHttpRoutingDomain); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublicHttpRoutingLocation); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestedPortsJsonObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScalingResource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServicePort); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceStackConnectedServiceStack); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceStackInfoJsonObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceStackLight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceStackLightJsonObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserAvatar); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserDataLight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserJsonObject); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserLight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerticalAutoscaling); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionBuildNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionGithubIntegrationNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionGitlabIntegrationNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionJsonObjectNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionLightNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppVersionPublicGitSourceNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientAvatarNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CustomAutoscalingNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GithubIntegrationNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GitlabIntegrationNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HorizontalAutoscalingNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Int32Null); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrepareCustomRuntimeNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimestampNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserAvatarNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserJsonObjectNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_zeropsApiProtocol_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerticalAutoscalingNull); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_zeropsApiProtocol_proto_rawDesc, - NumEnums: 23, - NumMessages: 115, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_zeropsApiProtocol_proto_goTypes, - DependencyIndexes: file_zeropsApiProtocol_proto_depIdxs, - EnumInfos: file_zeropsApiProtocol_proto_enumTypes, - MessageInfos: file_zeropsApiProtocol_proto_msgTypes, - }.Build() - File_zeropsApiProtocol_proto = out.File - file_zeropsApiProtocol_proto_rawDesc = nil - file_zeropsApiProtocol_proto_goTypes = nil - file_zeropsApiProtocol_proto_depIdxs = nil -} diff --git a/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.proto b/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.proto deleted file mode 100644 index 06e82594..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol.proto +++ /dev/null @@ -1,1662 +0,0 @@ -syntax = "proto3"; - -package zBusinessZeropsApiProtocol; -option go_package = "github.com/zeropsio/zcli/src/protocol/zBusinessZeropsApiProtocol"; - -service ZBusinessZeropsApiProtocol { - rpc PutAppVersionDeploy(PutAppVersionDeployRequest) returns (PutAppVersionDeployResponse); - rpc PutAppVersionBuildAndDeploy(PutAppVersionBuildAndDeployRequest) returns (PutAppVersionBuildAndDeployResponse); - rpc PostAppVersion(PostAppVersionRequest) returns (PostAppVersionResponse); - rpc DeleteProject(DeleteProjectRequest) returns (DeleteProjectResponse); - rpc GetProjectsByName(GetProjectsByNameRequest) returns (GetProjectsByNameResponse); - rpc PutProjectStart(PutProjectStartRequest) returns (PutProjectStartResponse); - rpc PutProjectStop(PutProjectStopRequest) returns (PutProjectStopResponse); - rpc PostProjectImport(PostProjectImportRequest) returns (PostProjectImportResponse); - rpc GetProcess(GetProcessRequest) returns (GetProcessResponse); - rpc PostPublicHttpRouting(PostPublicHttpRoutingRequest) returns (PostPublicHttpRoutingResponse); - rpc GetServiceStack(GetServiceStackRequest) returns (GetServiceStackResponse); - rpc DeleteServiceStack(DeleteServiceStackRequest) returns (DeleteServiceStackResponse); - rpc PutServiceStackStop(PutServiceStackStopRequest) returns (PutServiceStackStopResponse); - rpc PutServiceStackStart(PutServiceStackStartRequest) returns (PutServiceStackStartResponse); - rpc PutServiceStackRestart(PutServiceStackRestartRequest) returns (PutServiceStackRestartResponse); - rpc GetServiceStackByName(GetServiceStackByNameRequest) returns (GetServiceStackByNameResponse); - rpc PostServiceStackImport(PostServiceStackImportRequest) returns (PostServiceStackImportResponse); - rpc GetUserInfo(GetUserInfoRequest) returns (GetUserInfoResponse); - rpc PostVpnRequest(PostVpnRequestRequest) returns (PostVpnRequestResponse); -} - -message Error { - ErrorCode code = 1; - string message = 2; - bytes meta = 3; -} - -message ErrorNull { - Error value = 1; - bool valid = 2; -} - -enum ErrorCode { - NO_ERROR = 0; - INTERNAL_SERVER_ERROR = 1; - NOT_FOUND = 326; - INVALID_USER_INPUT = 2; - INVALID_USER_INPUT_WITH_TEXT = 3; - NOT_AUTHORIZED = 4; - INSUFFICIENT_PRIVILEGES = 5; - REFRESH_TOKEN_INVALID = 6; - ENDPOINT_NOT_FOUND = 7; - POTENTIALLY_FRAUD_BEHAVIOR_DETECTED = 8; - RE_CAPTCHA_RESPONSE_INVALID = 9; - DOWNLOAD_TOKEN_INVALID_OR_EXPIRED = 10; - INCORRECT_USER_CREDENTIALS = 11; - NO_RIGHTS_TO_SELECTED_ACTION = 12; - FILE_SIZE_LIMIT_EXCEEDED = 13; - ADDITIONAL_VERIFICATION_FAILED = 14; - AT_LEAST_ONE_MANAGER = 191; - ACTIVE_USER_MUST_BE_CONNECTED_TO_AT_LEAST_ONE_CLIENT = 15; - INVALID_CREDENTIALS = 16; - PASSWORD_TOO_SHORT = 270; - PASSWORD_TOO_LONG = 269; - NO_ACTIVE_CONNECTION_TO_ANY_CLIENT = 18; - NO_ACTIVE_CONNECTION_TO_CURRENT_CLIENT = 19; - TOKEN_EXPIRED = 20; - CLIENT_NOT_FOUND = 21; - NO_ACCESS_TO_ZEROPS = 22; - USER_NOT_FOUND = 23; - INVALID_DOCUMENT_ROOT = 24; - INVALID_ENTRYPOINT = 25; - INVALID_INIT_COMMANDS = 280; - DOWNLOAD_EXPIRED = 26; - MULTIPLE_ACCOUNTS_CONNECTED = 334; - USER_DATA_NOT_FOUND = 27; - USER_DATA_KEY_INVALID = 28; - USER_DATA_CONTENT_INVALID = 29; - USER_DATA_USE_OF_SYSTEM_KEY = 180; - USER_DATA_DELETE_FORBIDDEN = 30; - USER_DATA_DUPLICATE_KEY = 31; - USER_DATA_SYNC_RUNNING = 32; - USER_DATA_VERSION_MISMATCH = 168; - USER_TOKEN_NOT_FOUND = 227; - USER_ACCOUNT_NOT_FOUND = 34; - TEMPLATE_NOT_FOUND = 35; - COUNTRY_CALLING_CODE_DOES_NOT_MATCH_PHONE_NUMBER = 36; - INVALID_PHONE_NUMBER = 37; - INVALID_USER_ROLE = 38; - INVALID_CLIENT_USER_GROUP_COMBINATION = 39; - EMAIL_EXISTS = 40; - USER_ALREADY_CONNECTED_TO_COMPANY = 41; - COUNTRY_NOT_FOUND = 42; - RECORD_NOT_FOUND = 43; - MAXIMUM_NUMBER_OF_CLIENT_EXCEEDED = 44; - USER_IS_NOT_IN_BEING_DELETED_STATUS = 45; - UNABLE_TO_DELETE_YOUR_OWN_ACCOUNT = 46; - CLIENT_USER_CONNECTION_NOT_FOUND = 47; - CLIENT_USER_CONNECTION_HAS_BEEN_DELETED = 48; - BAD_OR_EXPIRED_ACTIVATION_LINK = 49; - UNABLE_TO_EDIT_DELETED_USER = 50; - CLIENT_USER_ALREADY_BEEN_DELETED = 51; - LANGUAGE_NOT_FOUND = 52; - LANGUAGE_NOT_SUPPORTED = 53; - DUPLICATED_USER = 54; - RECORD_IS_READ_ONLY = 55; - RECORD_IS_DELETED = 56; - RECORD_COMMON_KEY_EDIT = 57; - SERVICE_STACK_NOT_FOUND = 61; - SERVICE_STACK_TYPE_NOT_FOUND = 62; - SERVICE_STACK_TYPE_VERSION_NOT_FOUND = 63; - SERVICE_STACK_TYPE_VERSION_IS_NOT_ACTIVE = 64; - SERVICE_STACK_TYPE_VERSION_REMOVE_DEFAULT = 65; - SERVICE_STACK_TYPE_INVALID_VERSION = 66; - SERVICE_STACK_IS_FAILED = 67; - SERVICE_STACK_IS_SYSTEM_NOT_SUPPORTED = 68; - SERVICE_STACK_CUSTOM_PORTS_ENABLED_REQUIRED = 69; - SERVICE_STACK_TYPE_VERSION_NOT_MATCH_WITH_STACK_TYPE = 70; - SERVICE_STACK_STORAGE_DISK_MAX_LIMIT = 71; - SERVICE_STACK_STORAGE_DISK_MIN_LIMIT = 72; - SERVICE_STACK_OBJECT_STORAGE_QUOTA_NOT_FOUND = 73; - SERVICE_STACK_INIT_COMMANDS_NOT_FOUND = 281; - SERVICE_STACK_TYPE_OBJECT_STORAGE_REQUIRED = 74; - SERVICE_STACK_TYPE_OBJECT_STORAGE_FORBIDDEN = 75; - SERVICE_STACK_TYPE_SHARED_STORAGE_FORBIDDEN = 76; - SERVICE_STACK_TYPE_STANDARD_FORBIDDEN = 242; - SERVICE_STACK_IS_READY_TO_DEPLOY = 77; - SERVICE_STACK_IS_NOT_HTTP = 78; - SERVICE_STACK_RELOAD_NOT_AVAILABLE = 79; - SERVICE_STACK_NGINX_CONFIG = 194; - SERVICE_STACK_SUBDOMAIN_ACCESS_ALREADY_DISABLED = 81; - SERVICE_STACK_CREATING = 178; - SERVICE_STACK_UPGRADING = 179; - SERVICE_STACK_INVALID_CATEGORY = 203; - SERVICE_STACK_STATUS_NOT_SUPPORTED = 265; - SERVICE_STACK_USER_NAME_INVALID = 282; - ACTIVE_SERVICE_STACK_REQUIRED = 283; - USER_APPLICATION_RUNTIME_SERVICE_STACK_REQUIRED = 284; - SHARED_STORAGE_NONEMPTY_CONNECTED_STACKS_FORBIDDEN = 329; - SHARED_STORAGE_SERVICE_STACK_INACTIVE = 328; - PROCESS_NOT_FOUND = 82; - PROCESS_IS_ALREADY_OVER = 83; - PROCESS_IS_ALREADY_RUNNING = 85; - UNABLE_TO_CREATE_PROCESS = 87; - CREATE_PROCESS_QUEUED_PROJECT_PROCESS_COUNT_EXCEEDED = 323; - MANUAL_REPAIR_REQUIRED = 59; - NOTHING_TO_SYNC = 60; - IS_NOT_POSSIBLE_TO_EDIT_ANOTHER_USER = 58; - ACTIVE_SERVICE_STACK_EXISTS_IN_PROJECT = 88; - INVALID_OLD_PASSWORD = 89; - PROJECT_STATUS_NOT_SUPPORTED = 90; - PROJECT_NOT_FOUND = 91; - PROJECT_IS_NOT_ACTIVE = 167; - SERVICE_STACK_NAME_UNAVAILABLE = 92; - SERVICE_STACK_NAME_INVALID = 93; - CORE_SERVICE_STACK_TYPE_VERSION_NOT_FOUND = 94; - L7_HTTP_BALANCER_SERVICE_STACK_TYPE_VERSION_NOT_FOUND = 95; - PROJECT_WILL_BE_DELETED = 96; - PROJECT_WILL_BE_STARTED = 256; - PROJECT_WILL_BE_STOPPED = 257; - STACK_WILL_BE_DELETED = 97; - STACK_OF_PROJECT_WILL_BE_DELETED = 286; - STACK_OF_PROJECT_WILL_BE_CREATED = 287; - USER_DATA_OF_PROJECT_WILL_BE_SYNCED = 288; - PUBLIC_HTTP_ROUTING_NOT_FOUND = 98; - PUBLIC_HTTP_ROUTING_AT_LEAST_ONE_DOMAIN_REQUIRED = 99; - PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME = 100; - PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK = 101; - PUBLIC_HTTP_ROUTING_DUPLICATE_DOMAIN_NAME_IN_ANOTHER_ROUTING = 102; - PUBLIC_HTTP_ROUTING_DUPLICATE_FALLBACK_IN_ANOTHER_ROUTING = 103; - PUBLIC_HTTP_ROUTING_DUPLICATE_LOCATION_PATHS = 104; - PUBLIC_HTTP_ROUTING_ITEMS_LIMIT = 105; - PUBLIC_HTTP_ROUTING_LOCATIONS_LIMIT = 106; - PUBLIC_HTTP_ROUTING_DOMAINS_LIMIT = 107; - PUBLIC_HTTP_ROUTING_INVALID_DOMAIN_NAME_FQDN = 108; - PUBLIC_HTTP_ROUTING_SSL_FALLBACK = 109; - PUBLIC_HTTP_ROUTING_LOCATION_DOES_NOT_FOUND = 110; - PUBLIC_HTTP_ROUTING_INVALID_LOCATIONS_PREFIX = 111; - PUBLIC_HTTP_ROUTING_MULTIPLE_SERVICE_STACK_ACCESS_POINTS = 112; - PUBLIC_HTTP_ROUTING_SERVICE_STACK_ACCESS_POINT_NOT_FOUND = 113; - PUBLIC_HTTP_ROUTING_REQUEST_ONLY_TCP_PORT = 114; - PUBLIC_HTTP_ROUTING_SERVICE_STACK_DOES_NOT_SUPPORT_HTTP = 115; - PUBLIC_HTTP_ROUTING_FORBIDDEN_ZEROPS_SUBDOMAIN_SUFFIX = 327; - NO_PUBLIC_HTTP_ROUTING_IN_L7_HTTP_BALANCING = 116; - SSL_NOT_SUPPORTED = 117; - REGISTERED_DOMAIN_HOST_LIMIT_REACHED = 118; - PUBLIC_SUFFIX_LIST_CONTROL_FAILED = 119; - PORT_NOT_SUPPORTED = 120; - PUBLIC_HTTP_ROUTING_SYNC_RUNNING = 121; - PUBLIC_HTTP_ROUTING_VERSION_MISMATCH = 169; - PORT_OUT_OF_RANGE = 122; - PORT_PROTOCOL_INVALID = 123; - PORT_SCHEME_INVALID = 124; - UDP_PROTOCOL_SCHEME_MISMATCH = 125; - PUBLIC_IP_REQUEST_NOT_FOUND = 126; - PUBLIC_IP_REQUEST_ONLY_ONE = 128; - PUBLIC_IP_REQUEST_RELEASE_RUNNING = 130; - USER_NOTIFICATION_NOT_FOUND = 131; - PUBLIC_PORT_ROUTING_NOT_FOUND = 132; - PUBLIC_IP_TYPE_NOT_SUPPORTED = 133; - PORT_AND_PROTOCOL_COMBINATION_NOT_SUPPORTED = 134; - PUBLIC_PORT_ROUTING_DUPLICATE_RULE = 135; - INTERNAL_PORT_DUPLICATE_RULE = 181; - PUBLIC_PORT_ROUTING_SYNC_RUNNING = 136; - PUBLIC_PORT_ROUTING_INVALID_IP_FORMAT = 137; - PUBLIC_PORT_ROUTING_FIREWALL_POLICY_CONFLICT = 138; - PUBLIC_PORT_ROUTING_VERSION_MISMATCH = 170; - PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_DELETED_RECORD = 139; - PUBLIC_PORT_ROUTING_UNABLE_TO_EDIT_PORTS_ON_SYSTEM_SERVICE = 190; - DRIVER_NOT_FOUND = 140; - DRIVER_ENTITY_IS_NOT_SERVICE_STACK = 141; - DRIVER_ALREADY_SET = 142; - CLIENT_USER_CONNECTION_ALREADY_EXISTS = 143; - USER_ALREADY_ASSIGNED = 144; - SERVICE_STACK_TYPE_USER_STORAGE_REQUIRED = 145; - APP_VERSION_NOT_FOUND = 146; - APP_VERSION_INVALID_STATUS = 147; - DEPLOY_PROCESS_ALREADY_CREATED = 148; - OBJECT_CONTENT_LENGTH_ZERO = 149; - OBJECT_MIME_TYPE_NOT_SUPPORTED = 150; - OBJECT_NOT_FOUND = 151; - MAX_OBJECT_DISK_SIZE_ESTIMATE_EXCEEDED = 152; - APP_VERSION_IS_ACTIVE = 226; - APP_VERSION_NO_ACTIVE_FOUND = 310; - APP_VERSION_IS_BEING_DEPLOYED = 196; - APP_VERSION_IS_BEING_BUILT = 197; - APP_VERSION_IS_NOT_BEING_UPLOADED = 198; - APP_VERSION_DEPLOYING_FAILED = 199; - APP_VERSION_BUILDING_FAILED = 200; - APP_VERSION_YAML_PARSE_FAILED = 225; - APP_VERSION_YAML_CONFIG_REQUIRED = 324; - APP_VERSION_DATA_NOT_AVAILABLE = 285; - APP_VERSION_ACTIVE_HAS_DEFAULT_RUNTIME = 306; - SHARED_STORAGE_NOT_FOUND = 153; - SHARED_STORAGE_INVALID_PROJECT = 154; - SERVICE_STACK_CONNECTION_NOT_FOUND = 155; - SHARED_STORAGE_INVALID_CATEGORY = 156; - USER_SERVICE_STACK_INVALID_CATEGORY = 157; - IDENTICAL_SHARED_STORAGE_AND_SERVICE_STACK = 158; - CLIENT_ID_PROJECT_SERVICE_STACK_MISSING = 159; - DIFFERENT_PROJECT_IDS = 160; - STATS_HISTORY_SEARCH_LIMIT_INVALID = 171; - STATS_HISTORY_SEARCH_TIME_GROUP_BY_INVALID = 192; - STATS_HISTORY_SEARCH_ID_FILTER_INVALID = 172; - STATS_HISTORY_SEARCH_PROJECT_ID_REQUIRED = 173; - STATS_HISTORY_SEARCH_SUBSCRIPTION_NOT_SUPPORTED = 174; - STATS_HISTORY_SEARCH_HISTORY_LIMIT_REACHED = 193; - STATS_HISTORY_SEARCH_RANGE_INVALID = 274; - STATS_HISTORY_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED = 278; - STATS_HISTORY_SEARCH_FULL_RANGE_REQUIRED = 276; - TRANSACTION_DEBIT_SEARCH_LIMIT_INVALID = 260; - TRANSACTION_DEBIT_SEARCH_TIME_GROUP_BY_INVALID = 261; - TRANSACTION_DEBIT_SEARCH_RANGE_INVALID = 273; - TRANSACTION_DEBIT_SEARCH_CLIENT_ID_REQUIRED = 262; - TRANSACTION_DEBIT_SEARCH_ID_FILTER_INVALID = 263; - TRANSACTION_DEBIT_SEARCH_EITHER_RANGE_OR_LIMIT_REQUIRED = 277; - TRANSACTION_DEBIT_SEARCH_FULL_RANGE_REQUIRED = 272; - TRANSACTION_DEBIT_SEARCH_TILL_AND_FROM_DATE_TIMEZONES_DIFFER = 300; - TRANSACTION_DEBIT_SEARCH_UNKNOWN_TIMEZONE = 301; - TRANSACTION_DEBIT_SEARCH_INVALID_FILTER = 271; - GITHUB_VERIFICATION_EXPIRED = 188; - INVALID_GITHUB_TOKEN_ACTION = 182; - GITHUB_REQUEST_FAILED = 183; - GITHUB_AUTHORIZATION_REQUIRED = 184; - GITHUB_EMAIL_ACCESS_REQUIRED = 185; - GITHUB_NO_VERIFIED_EMAIL_FOUND = 186; - GITHUB_REPOSITORY_ACCESS_REQUIRED = 187; - GITHUB_RATE_LIMIT_EXCEEDED = 189; - SERVICE_STACK_NO_GITHUB_INTEGRATION = 206; - BRANCH_NAME_REQUIRED = 207; - TRIGGER_BUILD_REQUIRES_BRANCH_EVENT_TYPE = 268; - USER_SERVICE_STACK_REQUIRED = 208; - NO_EXTERNAL_REPOSITORY_INTEGRATION = 209; - GITHUB_BRANCH_DELETED = 210; - GITHUB_WEBHOOK_DELETED = 211; - GITHUB_WEBHOOK_INVALID_PARAMETERS = 212; - UNEXPECTED_GITHUB_FILE_ENCODING = 218; - ZEROPS_BUILD_FILE_NOT_FOUND = 219; - INCORRECT_WEBHOOK_SECRET = 213; - UNSUPPORTED_WEBHOOK_EVENT_TYPE = 214; - REPOSITORY_DOES_NOT_MATCH_SERVICE_STACK_SETTINGS = 215; - PROJECT_STATUS_NOT_IN_NEW_CREATING_ACTIVE = 216; - GITHUB_PUSH_IGNORED = 217; - ZEROPS_BUILD_FILE_TOO_LARGE = 204; - SAME_SERVICE_STACK_TYPE_USED = 205; - GITHUB_WRONG_REPOSITORY_FULL_NAME_FORMAT = 220; - GITHUB_WEBHOOKS_LIMIT_EXCEEDED = 221; - AVATAR_UPLOAD_FORBIDDEN_IMAGE_TYPE = 222; - AVATAR_UPLOAD_MAX_SIZE = 223; - AVATAR_UPLOAD_FILE_NOT_FOUND = 224; - GITLAB_RATE_LIMIT_EXCEEDED = 228; - GITLAB_VERIFICATION_EXPIRED = 229; - INVALID_GITLAB_TOKEN_ACTION = 230; - GITLAB_REQUEST_FAILED = 231; - GITLAB_AUTHORIZATION_REQUIRED = 232; - GITLAB_FULL_API_ACCESS_REQUIRED = 233; - MULTIPLE_INTEGRATIONS_ARE_FORBIDDEN = 234; - GITLAB_BRANCH_DELETED = 235; - GITLAB_WEBHOOK_DELETED = 236; - GITLAB_WEBHOOK_INVALID_PARAMETERS = 237; - SERVICE_STACK_NO_GITLAB_INTEGRATION = 238; - GITLAB_PUSH_IGNORED = 239; - YAML_FIELD_LENGTH_ERROR = 240; - YAML_WRONG_USE_FIELD_TYPE = 241; - VAT_NUMBER_NOT_IN_EUCOUNTRY = 254; - COMPANY_NOT_FOUND_IN_EU = 258; - VAT_NUMBER_MISSING = 244; - PAYMENT_IN_PROGRESS = 245; - DUPLICATE_VAT_NUMBER = 250; - DUPLICATE_COMPANY_NUMBER = 302; - CURRENCY_CHANGE = 303; - ADMIN_USER_ACCOUNT_EXISTS = 266; - CREDIT_LIMIT_REACHED = 246; - INSUFFICIENT_CREDIT = 247; - PROJECT_LOCK_FAILED = 248; - PROJECT_UPDATE_FAILED = 249; - MAXIMUM_AMOUNT_EXCEEDED = 267; - PAYMENT_FAILED_ERROR = 252; - PAYMENT_NOT_FOUND = 253; - ADDON_NOT_FOUND = 255; - INVOICE_NOT_FOUND = 259; - PRICE_LIST_NOT_FOUND = 264; - COST_LIMIT_TOO_SMALL = 279; - PROJECT_IMPORT_INVALID_YAML = 289; - PROJECT_IMPORT_INVALID_CONFIG_STRUCTURE = 290; - PROJECT_IMPORT_INVALID_PARAMETER = 295; - PROJECT_IMPORT_INVALID_TYPE_VERSION = 292; - PROJECT_IMPORT_MISSING_PARAMETER = 293; - PROJECT_IMPORT_UNABLE_TO_CREATE_SERVICE_STACK = 294; - PROJECT_IMPORT_PROJECT_INCLUDED = 296; - PROJECT_IMPORT_PROJECT_MISSING = 297; - PROJECT_IMPORT_MISSING_SERVICE = 298; - INVALID_CUSTOM_AUTOSCALING_VALUE = 309; - INVALID_CUSTOM_AUTOSCALING_CPU_RAM_RATIO = 335; - CUSTOM_VERTICAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY = 305; - CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_FOR_THIS_STACK_CATEGORY = 307; - CUSTOM_HORIZONTAL_AUTOSCALING_FORBIDDEN_IN_NON_HA_MODE = 308; - ACTION_FORBIDDEN_FOR_THIS_STACK_CATEGORY = 311; - MODE_UPDATE_FORBIDDEN_FOR_THIS_STACK_CATEGORY = 312; - YAML_VALIDATION_INVALID_YAML = 304; - UNEXPECTED_YAML_ENCODING = 325; - BUCKET_ALREADY_EXISTS = 336; - S3_API_REQUEST_FAILED = 337; - USER_ID_WAS_NOT_FOUND = 161; - AUTHOR_ID_WAS_NOT_FOUND = 162; - USER_DOES_NOT_HAVE_ACTIVE_CONNECTION_TO_ANY_CLIENT = 163; - USER_HAS_NOT_ACCESS_TO_ZEROPS = 164; - INVALID_EMAIL_TOKEN = 195; - CLIENT_CREATE_FAILED = 321; - CLIENT_ID_TOO_LONG = 322; - TRANSFER_ID_TOO_LONG = 316; - EMAIL_IS_INVALID = 313; - USER_ACCOUNT_DELETED = 314; - NO_CONTABO_CLIENT_CONNECTED = 315; - AMBIGUOUS_USER = 330; - AMBIGUOUS_USER_SIGN_IN = 331; - UNSUPPORTED_CURRENCY = 317; - INVALID_CURRENCY_CODE = 320; - TRANSFER_PARAM_MISMATCH = 318; - INVALID_AMOUNT = 333; - -} - -message Timestamp { - bool isSet = 1; - int64 seconds = 2; - int32 nanos = 3; -} - -// -// REQUEST OBJECTS -// - -message DeleteProjectRequest { - string id = 1; - -} - -message DeleteServiceStackRequest { - string id = 1; - -} - -message GetProcessRequest { - string id = 1; - -} - -message GetProjectsByNameRequest { - string name = 1; - -} - -message GetServiceStackRequest { - string id = 1; - -} - -message GetServiceStackByNameRequest { - string projectId = 2; - string name = 1; - -} - -message GetUserInfoRequest { - -} - -message PostAppVersionRequest { - string serviceStackId = 1; - StringNull name = 2; - -} - -message PostProjectImportRequest { - string clientId = 1; - string yaml = 2; - -} - -message PostPublicHttpRoutingRequest { - string projectId = 1; - bool sslEnabled = 2; - repeated string domains = 3; - repeated PublicHttpRoutingLocationPost locations = 4; - -} - -message PostServiceStackImportRequest { - string projectId = 1; - string yaml = 2; - -} - -message PostVpnRequestRequest { - string id = 1; - string clientPublicKey = 2; - -} - -message PublicHttpRoutingLocationPost { - string path = 1; - int32 port = 2; - string serviceStackId = 3; - -} - -message PutAppVersionBuildAndDeployRequest { - string id = 1; - string buildConfigContent = 5; - StringNull source = 7; - -} - -message PutAppVersionDeployRequest { - string id = 1; - StringNull configContent = 3; - StringNull source = 4; - -} - -message PutProjectStartRequest { - string id = 1; - -} - -message PutProjectStopRequest { - string id = 1; - -} - -message PutServiceStackRestartRequest { - string id = 1; - -} - -message PutServiceStackStartRequest { - string id = 1; - -} - -message PutServiceStackStopRequest { - string id = 1; - -} - - - -// -// RESPONSE OBJECTS -// - - -message DeleteProjectResponse { - Error error = 1; - DeleteProjectResponseDto output = 2; -} - -message DeleteProjectResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - -message DeleteServiceStackResponse { - Error error = 1; - DeleteServiceStackResponseDto output = 2; -} - -message DeleteServiceStackResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - -message GetProcessResponse { - Error error = 1; - GetProcessResponseDto output = 2; -} - -message GetProcessResponseDto { - string id = 1; - string clientId = 2; - string projectId = 14; - StringNull serviceStackId = 15; - ProjectLightJsonObject project = 3; - repeated ServiceStackLightJsonObject serviceStacks = 4; - ProcessStatus status = 5; - int32 sequence = 16; - UserJsonObject createdByUser = 6; - UserJsonObjectNull canceledByUser = 7; - string actionName = 8; - Timestamp created = 10; - Timestamp lastUpdate = 11; - TimestampNull started = 17; - TimestampNull finished = 18; - bool createdBySystem = 12; - AppVersionJsonObjectNull appVersion = 13; - -} - - -message GetProjectsByNameResponse { - Error error = 1; - GetProjectsByNameResponseDto output = 2; -} - -message GetProjectsByNameResponseDto { - repeated Project projects = 1; - -} - - -message GetServiceStackResponse { - Error error = 1; - GetServiceStackResponseDto output = 2; -} - -message GetServiceStackResponseDto { - string id = 1; - ServiceStackStatus status = 2; - string name = 3; - ServiceStackInfoJsonObject serviceStackTypeInfo = 4; - string serviceStackTypeId = 5; - string serviceStackTypeVersionId = 6; - bool isSystem = 7; - bool startOnProjectStart = 31; - GithubIntegrationNull githubIntegration = 26; - GitlabIntegrationNull gitlabIntegration = 29; - CustomAutoscalingNull customAutoscaling = 33; - repeated ServicePort ports = 8; - RequestedPortsJsonObject requestedPorts = 9; - Timestamp created = 10; - Timestamp lastUpdate = 11; - ServiceStackMode mode = 12; - bool customPortsEnabled = 13; - bool subdomainAccess = 14; - bool reloadAvailable = 15; - string versionNumber = 16; - string projectId = 32; - ProjectLight project = 17; - repeated ServiceStackConnectedServiceStack connectedStacks = 18; - repeated UserDataLight userData = 34; - AppVersionLightNull activeAppVersion = 19; - bool hasUnsyncedUserDataRecord = 20; - bool hasUnsyncedPublicHttpRoutingRecord = 21; - bool hasUnsyncedPublicPortRecord = 22; - bool hasPublicPortRoutingAccess = 24; - bool hasPublicHttpRoutingAccess = 25; - Int32Null activePublicHttpRoutingCount = 27; - Int32Null activePublicPortRoutingCount = 28; - -} - - -message GetServiceStackByNameResponse { - Error error = 1; - GetServiceStackByNameResponseDto output = 2; -} - -message GetServiceStackByNameResponseDto { - string id = 1; - ServiceStackStatus status = 2; - string name = 3; - ServiceStackInfoJsonObject serviceStackTypeInfo = 4; - string serviceStackTypeId = 5; - string serviceStackTypeVersionId = 6; - bool isSystem = 7; - bool startOnProjectStart = 31; - GithubIntegrationNull githubIntegration = 26; - GitlabIntegrationNull gitlabIntegration = 29; - CustomAutoscalingNull customAutoscaling = 33; - repeated ServicePort ports = 8; - RequestedPortsJsonObject requestedPorts = 9; - Timestamp created = 10; - Timestamp lastUpdate = 11; - ServiceStackMode mode = 12; - bool customPortsEnabled = 13; - bool subdomainAccess = 14; - bool reloadAvailable = 15; - string versionNumber = 16; - string projectId = 32; - ProjectLight project = 17; - repeated ServiceStackConnectedServiceStack connectedStacks = 18; - repeated UserDataLight userData = 34; - AppVersionLightNull activeAppVersion = 19; - bool hasUnsyncedUserDataRecord = 20; - bool hasUnsyncedPublicHttpRoutingRecord = 21; - bool hasUnsyncedPublicPortRecord = 22; - bool hasPublicPortRoutingAccess = 24; - bool hasPublicHttpRoutingAccess = 25; - Int32Null activePublicHttpRoutingCount = 27; - Int32Null activePublicPortRoutingCount = 28; - -} - - -message GetUserInfoResponse { - Error error = 1; - GetUserInfoResponseDto output = 2; -} - -message GetUserInfoResponseDto { - string id = 1; - string email = 2; - string fullName = 3; - string firstName = 4; - string lastName = 5; - UserAvatarNull avatar = 13; - Int32Null countryCallingCode = 6; - Int32Null phoneNumber = 7; - Language language = 8; - Timestamp created = 9; - Timestamp lastUpdate = 10; - UserStatus status = 11; - repeated ClientUserExtra clientUserList = 12; - bool passwordIsSet = 14; - -} - - -message PostAppVersionResponse { - Error error = 1; - PostAppVersionResponseDto output = 2; -} - -message PostAppVersionResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - string serviceStackId = 4; - AppVersionBuildNull build = 13; - int32 sequence = 5; - AppVersionStatus status = 6; - repeated AppVersionUserData userDataList = 7; - Timestamp created = 8; - Timestamp lastUpdate = 9; - string uploadUrl = 10; - -} - - -message PostProjectImportResponse { - Error error = 1; - PostProjectImportResponseDto output = 2; -} - -message PostProjectImportResponseDto { - string projectId = 1; - string projectName = 2; - repeated ProjectImportServiceStack serviceStacks = 3; - -} - - -message PostPublicHttpRoutingResponse { - Error error = 1; - PostPublicHttpRoutingResponseDto output = 2; -} - -message PostPublicHttpRoutingResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - bool sslEnabled = 4; - repeated PublicHttpRoutingDomain domains = 5; - repeated PublicHttpRoutingLocation locations = 6; - Timestamp created = 7; - Timestamp lastUpdate = 8; - bool isSynced = 9; - bool isEditable = 11; - bool deleteOnSync = 12; - -} - - -message PostServiceStackImportResponse { - Error error = 1; - PostServiceStackImportResponseDto output = 2; -} - -message PostServiceStackImportResponseDto { - string projectId = 1; - string projectName = 2; - repeated ProjectImportServiceStack serviceStacks = 3; - -} - - -message PostVpnRequestResponse { - Error error = 1; - PostVpnRequestResponseDto output = 2; -} - -message PostVpnRequestResponseDto { - string accessToken = 1; - Timestamp expiry = 2; - -} - - -message PutAppVersionBuildAndDeployResponse { - Error error = 1; - PutAppVersionBuildAndDeployResponseDto output = 2; -} - -message PutAppVersionBuildAndDeployResponseDto { - string id = 1; - string clientId = 2; - string projectId = 14; - StringNull serviceStackId = 15; - ProjectLightJsonObject project = 3; - repeated ServiceStackLightJsonObject serviceStacks = 4; - ProcessStatus status = 5; - int32 sequence = 16; - UserJsonObject createdByUser = 6; - UserJsonObjectNull canceledByUser = 7; - string actionName = 8; - Timestamp created = 10; - Timestamp lastUpdate = 11; - TimestampNull started = 17; - TimestampNull finished = 18; - bool createdBySystem = 12; - AppVersionJsonObjectNull appVersion = 13; - -} - - -message PutAppVersionDeployResponse { - Error error = 1; - PutAppVersionDeployResponseDto output = 2; -} - -message PutAppVersionDeployResponseDto { - string id = 1; - string clientId = 2; - string projectId = 14; - StringNull serviceStackId = 15; - ProjectLightJsonObject project = 3; - repeated ServiceStackLightJsonObject serviceStacks = 4; - ProcessStatus status = 5; - int32 sequence = 16; - UserJsonObject createdByUser = 6; - UserJsonObjectNull canceledByUser = 7; - string actionName = 8; - Timestamp created = 10; - Timestamp lastUpdate = 11; - TimestampNull started = 17; - TimestampNull finished = 18; - bool createdBySystem = 12; - AppVersionJsonObjectNull appVersion = 13; - -} - - -message PutProjectStartResponse { - Error error = 1; - PutProjectStartResponseDto output = 2; -} - -message PutProjectStartResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - -message PutProjectStopResponse { - Error error = 1; - PutProjectStopResponseDto output = 2; -} - -message PutProjectStopResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - -message PutServiceStackRestartResponse { - Error error = 1; - PutServiceStackRestartResponseDto output = 2; -} - -message PutServiceStackRestartResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - -message PutServiceStackStartResponse { - Error error = 1; - PutServiceStackStartResponseDto output = 2; -} - -message PutServiceStackStartResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - -message PutServiceStackStopResponse { - Error error = 1; - PutServiceStackStopResponseDto output = 2; -} - -message PutServiceStackStopResponseDto { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - - - - -// -// RESPONSE DTO OBJECTS -// - -message AppVersionBuild { - StringNull serviceStackId = 1; - StringNull serviceStackName = 2; - StringNull serviceStackTypeVersionId = 3; - TimestampNull pipelineStart = 10; - TimestampNull pipelineFinish = 11; - TimestampNull pipelineFailed = 12; - TimestampNull containerCreationStart = 9; - TimestampNull startDate = 4; - TimestampNull endDate = 5; - bool cacheUsed = 6; - bool hasCurrentCache = 7; - -} - -message AppVersionGithubIntegration { - AppVersionGithubIntegrationEventType eventType = 1; - StringNull branchName = 2; - string pusher = 3; - string commit = 4; - string repositoryFullName = 5; - StringNull tagName = 6; - -} - -message AppVersionGitlabIntegration { - AppVersionGitlabIntegrationEventType eventType = 1; - StringNull branchName = 2; - string pusher = 3; - string commit = 4; - string repositoryFullName = 5; - StringNull tagName = 6; - -} - -message AppVersionJsonObject { - string id = 1; - StringNull serviceStackId = 15; - StringNull projectId = 16; - AppVersionStatus status = 9; - AppVersionSource source = 2; - int32 sequence = 3; - StringNull name = 10; - TimestampNull created = 11; - AppVersionBuildNull build = 4; - PrepareCustomRuntimeNull prepareCustomRuntime = 13; - AppVersionGithubIntegrationNull githubIntegration = 5; - AppVersionGitlabIntegrationNull gitlabIntegration = 6; - UserJsonObjectNull createdByUser = 7; - TimestampNull activationDate = 8; - AppVersionPublicGitSourceNull publicGitSource = 12; - StringNull configContent = 14; - -} - -message AppVersionLight { - string id = 1; - AppVersionStatus status = 2; - Timestamp created = 3; - Timestamp lastUpdate = 4; - -} - -message AppVersionPublicGitSource { - string gitUrl = 1; - string branchName = 2; - -} - -message AppVersionUserData { - string key = 1; - string content = 2; - UserDataType type = 3; - -} - -message ClientAvatar { - StringNull largeAvatarUrl = 1; - StringNull smallAvatarUrl = 2; - StringNull externalAvatarUrl = 3; - -} - -message ClientExtra { - string id = 1; - string companyName = 2; - StringNull companyNumber = 3; - StringNull vatNumber = 4; - ClientAvatarNull avatar = 5; - string accountName = 6; - -} - -message ClientUserExtra { - string id = 1; - string clientId = 2; - string userId = 3; - ClientUserLightStatus status = 4; - ClientUserLightRoleCode roleCode = 5; - ClientExtra client = 6; - UserLight user = 7; - -} - -message CustomAutoscaling { - VerticalAutoscalingNull verticalAutoscaling = 1; - HorizontalAutoscalingNull horizontalAutoscaling = 2; - -} - -message GithubIntegration { - string userId = 1; - bool authorizationRequired = 2; - StringNull branchName = 3; - GithubIntegrationEventType eventType = 5; - bool isActive = 6; - string repositoryFullName = 7; - Int32Null webhookId = 9; - -} - -message GitlabIntegration { - string userId = 1; - bool authorizationRequired = 2; - StringNull branchName = 3; - GitlabIntegrationEventType eventType = 4; - bool isActive = 5; - string repositoryFullName = 6; - Int32Null webhookId = 7; - -} - -message HorizontalAutoscaling { - int32 maxContainerCount = 1; - int32 minContainerCount = 2; - -} - -message Language { - string id = 1; - string name = 2; - -} - -message LocationServiceStackInfo { - string serviceStackName = 1; - string serviceStackTypeName = 2; - string serviceStackTypeVersionName = 3; - -} - -message PrepareCustomRuntime { - TimestampNull containerCreationStart = 8; - TimestampNull startDate = 1; - TimestampNull endDate = 2; - StringNull serviceStackId = 5; - StringNull serviceStackName = 6; - -} - -message Process { - string id = 1; - string clientId = 2; - string projectId = 3; - StringNull serviceStackId = 4; - ProjectLightJsonObject project = 5; - repeated ServiceStackLightJsonObject serviceStacks = 6; - ProcessStatus status = 7; - int32 sequence = 8; - UserJsonObject createdByUser = 9; - UserJsonObjectNull canceledByUser = 10; - string actionName = 11; - Timestamp created = 12; - Timestamp lastUpdate = 13; - TimestampNull started = 14; - TimestampNull finished = 15; - bool createdBySystem = 16; - AppVersionJsonObjectNull appVersion = 17; - -} - -message Project { - string id = 1; - string clientId = 2; - string name = 3; - StringNull description = 4; - repeated string tagList = 5; - ProjectStatus status = 6; - Timestamp created = 7; - Timestamp lastUpdate = 8; - StringNull publicIpV4 = 9; - StringNull publicIpV6 = 10; - StringNull zeropsSubdomainHost = 13; - bool autoStartup = 14; - -} - -message ProjectImportServiceStack { - string id = 1; - string name = 2; - ErrorNull error = 3; - repeated Process processes = 4; - -} - -message ProjectLight { - string id = 1; - string clientId = 2; - string name = 3; - StringNull description = 4; - repeated string tagList = 5; - ProjectStatus status = 6; - Timestamp created = 7; - Timestamp lastUpdate = 8; - -} - -message ProjectLightJsonObject { - string id = 1; - string clientId = 2; - string name = 3; - StringNull description = 4; - repeated string tagList = 5; - ProjectStatus status = 6; - Timestamp created = 7; - Timestamp lastUpdate = 8; - -} - -message PublicHttpRoutingDomain { - string domainName = 1; - PublicHttpRoutingDomainDnsCheckStatus dnsCheckStatus = 2; - PublicHttpRoutingDomainSslStatus sslStatus = 3; - -} - -message PublicHttpRoutingLocation { - string path = 1; - int32 port = 2; - string serviceStackId = 3; - LocationServiceStackInfo serviceStackInfo = 4; - -} - -message RequestedPortsJsonObject { - bool isActive = 1; - repeated ServicePort requestedPorts = 2; - -} - -message ScalingResource { - int32 cpuCoreCount = 1; - float memoryGBytes = 2; - float diskGBytes = 3; - -} - -message ServicePort { - ServicePortProtocol protocol = 1; - int32 port = 2; - string description = 3; - ServicePortScheme scheme = 4; - StringNull serviceId = 5; - -} - -message ServiceStackConnectedServiceStack { - ServiceStackLight serviceStack = 1; - ServiceStackConnectionStatus status = 2; - -} - -message ServiceStackInfoJsonObject { - string serviceStackTypeName = 1; - ServiceStackTypeCategory serviceStackTypeCategory = 2; - string serviceStackTypeVersionName = 3; - -} - -message ServiceStackLight { - string id = 1; - ServiceStackStatus status = 2; - string name = 3; - ServiceStackInfoJsonObject serviceStackTypeInfo = 4; - string serviceStackTypeId = 5; - string serviceStackTypeVersionId = 6; - bool isSystem = 7; - bool startOnProjectStart = 11; - GithubIntegrationNull githubIntegration = 8; - GitlabIntegrationNull gitlabIntegration = 9; - CustomAutoscalingNull customAutoscaling = 12; - -} - -message ServiceStackLightJsonObject { - string id = 1; - Timestamp created = 2; - Timestamp lastUpdate = 3; - string projectId = 4; - string serviceStackTypeId = 5; - string serviceStackTypeVersionId = 6; - StringNull driverId = 7; - string name = 8; - ServiceStackInfoJsonObject serviceStackTypeInfo = 9; - repeated ServicePort ports = 10; - -} - -message UserAvatar { - StringNull largeAvatarUrl = 1; - StringNull smallAvatarUrl = 2; - StringNull externalAvatarUrl = 3; - -} - -message UserDataLight { - string id = 1; - string clientId = 2; - string projectId = 3; - string serviceStackId = 4; - string key = 5; - string content = 6; - UserDataType type = 7; - Timestamp created = 8; - Timestamp lastUpdate = 9; - bool isSynced = 10; - bool deleteOnSync = 11; - UserDataVersion version = 12; - TimestampNull lastSync = 13; - -} - -message UserJsonObject { - UserJsonObjectType type = 5; - StringNull id = 1; - StringNull email = 2; - StringNull firstName = 3; - StringNull fullName = 4; - UserAvatarNull avatar = 6; - -} - -message UserLight { - string id = 1; - string email = 2; - string fullName = 3; - string firstName = 4; - string lastName = 5; - UserAvatarNull avatar = 6; - -} - -message VerticalAutoscaling { - ScalingResource maxResource = 1; - ScalingResource minResource = 2; - -} - - -// -// ENUMS -// - -enum AppVersionGithubIntegrationEventType { - APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN = 0; - APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_BRANCH = 1; - APP_VERSION_GITHUB_INTEGRATION_EVENT_TYPE_TAG = 2; - -} - -enum AppVersionGitlabIntegrationEventType { - APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN = 0; - APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_BRANCH = 1; - APP_VERSION_GITLAB_INTEGRATION_EVENT_TYPE_TAG = 2; - -} - -enum AppVersionSource { - APP_VERSION_SOURCE_UNKNOWN = 0; - APP_VERSION_SOURCE_CLI = 1; - APP_VERSION_SOURCE_GUI = 2; - APP_VERSION_SOURCE_GITHUB = 3; - APP_VERSION_SOURCE_GITLAB = 4; - APP_VERSION_SOURCE_GIT = 5; - -} - -enum AppVersionStatus { - APP_VERSION_STATUS_UNKNOWN = 0; - APP_VERSION_STATUS_UPLOADING = 1; - APP_VERSION_STATUS_WAITING_TO_DEPLOY = 2; - APP_VERSION_STATUS_DEPLOYING = 3; - APP_VERSION_STATUS_DEPLOY_FAILED = 4; - APP_VERSION_STATUS_ACTIVE = 5; - APP_VERSION_STATUS_BACKUP = 6; - APP_VERSION_STATUS_BUILDING = 7; - APP_VERSION_STATUS_WAITING_TO_BUILD = 8; - APP_VERSION_STATUS_BUILD_FAILED = 9; - APP_VERSION_STATUS_PREPARING_RUNTIME = 10; - APP_VERSION_STATUS_PREPARING_RUNTIME_FAILED = 11; - APP_VERSION_STATUS_BUILD_VALIDATION_FAILED = 12; - -} - -enum ClientUserLightRoleCode { - CLIENT_USER_LIGHT_ROLE_CODE_UNKNOWN = 0; - CLIENT_USER_LIGHT_ROLE_CODE_MANAGER = 1; - -} - -enum ClientUserLightStatus { - CLIENT_USER_LIGHT_STATUS_UNKNOWN = 0; - CLIENT_USER_LIGHT_STATUS_ACTIVE = 1; - CLIENT_USER_LIGHT_STATUS_WAITING_AUTHORIZATION = 2; - CLIENT_USER_LIGHT_STATUS_BEING_DELETED = 3; - -} - -enum GithubIntegrationEventType { - GITHUB_INTEGRATION_EVENT_TYPE_UNKNOWN = 0; - GITHUB_INTEGRATION_EVENT_TYPE_BRANCH = 1; - GITHUB_INTEGRATION_EVENT_TYPE_TAG = 2; - -} - -enum GitlabIntegrationEventType { - GITLAB_INTEGRATION_EVENT_TYPE_UNKNOWN = 0; - GITLAB_INTEGRATION_EVENT_TYPE_BRANCH = 1; - GITLAB_INTEGRATION_EVENT_TYPE_TAG = 2; - -} - -enum ProcessStatus { - PROCESS_STATUS_UNKNOWN = 0; - PROCESS_STATUS_PENDING = 1; - PROCESS_STATUS_RUNNING = 2; - PROCESS_STATUS_ROLLBACKING = 3; - PROCESS_STATUS_CANCELING = 4; - PROCESS_STATUS_FINISHED = 5; - PROCESS_STATUS_FAILED = 6; - PROCESS_STATUS_CANCELED = 7; - -} - -enum ProjectStatus { - PROJECT_STATUS_UNKNOWN = 0; - PROJECT_STATUS_NEW = 1; - PROJECT_STATUS_CREATING = 2; - PROJECT_STATUS_ACTIVE = 3; - PROJECT_STATUS_DELETING = 4; - PROJECT_STATUS_FAILED = 5; - PROJECT_STATUS_STOPPING = 6; - PROJECT_STATUS_STOPPED = 7; - PROJECT_STATUS_STARTING = 8; - -} - -enum PublicHttpRoutingDomainDnsCheckStatus { - PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_UNKNOWN = 0; - PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_PENDING = 1; - PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_CHECKING = 2; - PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_OK = 3; - PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_FAILED = 4; - PUBLIC_HTTP_ROUTING_DOMAIN_DNS_CHECK_STATUS_IGNORED = 5; - -} - -enum PublicHttpRoutingDomainSslStatus { - PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_UNKNOWN = 0; - PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INACTIVE = 1; - PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_BEING_INSTALLED = 2; - PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_WAITING_FOR_DNS = 3; - PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_ACTIVE = 4; - PUBLIC_HTTP_ROUTING_DOMAIN_SSL_STATUS_INSTALLATION_FAILED = 5; - -} - -enum ServicePortProtocol { - SERVICE_PORT_PROTOCOL_UNKNOWN = 0; - SERVICE_PORT_PROTOCOL_tcp = 1; - SERVICE_PORT_PROTOCOL_udp = 2; - -} - -enum ServicePortScheme { - SERVICE_PORT_SCHEME_UNKNOWN = 0; - SERVICE_PORT_SCHEME_tcp = 1; - SERVICE_PORT_SCHEME_udp = 2; - SERVICE_PORT_SCHEME_http = 3; - SERVICE_PORT_SCHEME_https = 4; - SERVICE_PORT_SCHEME_redis = 5; - SERVICE_PORT_SCHEME_mysql = 7; - SERVICE_PORT_SCHEME_udpinflux = 8; - SERVICE_PORT_SCHEME_mongodb = 9; - SERVICE_PORT_SCHEME_postgresql = 10; - SERVICE_PORT_SCHEME_amqp = 11; - SERVICE_PORT_SCHEME_stomp = 12; - SERVICE_PORT_SCHEME_mqtt = 13; - -} - -enum ServiceStackConnectionStatus { - SERVICE_STACK_CONNECTION_STATUS_UNKNOWN = 0; - SERVICE_STACK_CONNECTION_STATUS_CREATING = 1; - SERVICE_STACK_CONNECTION_STATUS_ACTIVE = 2; - SERVICE_STACK_CONNECTION_STATUS_DELETING = 3; - -} - -enum ServiceStackMode { - SERVICE_STACK_MODE_UNKNOWN = 0; - SERVICE_STACK_MODE_HA = 1; - SERVICE_STACK_MODE_NON_HA = 2; - -} - -enum ServiceStackStatus { - SERVICE_STACK_STATUS_UNKNOWN = 0; - SERVICE_STACK_STATUS_NEW = 1; - SERVICE_STACK_STATUS_CREATING = 2; - SERVICE_STACK_STATUS_ACTIVE = 3; - SERVICE_STACK_STATUS_STOPPING = 4; - SERVICE_STACK_STATUS_STOPPED = 5; - SERVICE_STACK_STATUS_STARTING = 6; - SERVICE_STACK_STATUS_RESTARTING = 7; - SERVICE_STACK_STATUS_RELOADING = 8; - SERVICE_STACK_STATUS_DELETING = 9; - SERVICE_STACK_STATUS_DELETED = 10; - SERVICE_STACK_STATUS_FAILED = 11; - SERVICE_STACK_STATUS_ACTION_FAILED = 29; - SERVICE_STACK_STATUS_UPGRADING = 13; - SERVICE_STACK_STATUS_READY_TO_DEPLOY = 14; - SERVICE_STACK_STATUS_SERVICE_CREATING = 18; - SERVICE_STACK_STATUS_SERVICE_ACTIVE = 35; - SERVICE_STACK_STATUS_SERVICE_STOPPING = 21; - SERVICE_STACK_STATUS_SERVICE_STOPPED = 22; - SERVICE_STACK_STATUS_SERVICE_STARTING = 23; - SERVICE_STACK_STATUS_SERVICE_RESTARTING = 24; - SERVICE_STACK_STATUS_SERVICE_RELOADING = 25; - SERVICE_STACK_STATUS_SERVICE_DELETING = 15; - SERVICE_STACK_STATUS_SERVICE_DELETED = 36; - SERVICE_STACK_STATUS_SERVICE_FAILED = 16; - SERVICE_STACK_STATUS_SERVICE_ACTION_FAILED = 28; - SERVICE_STACK_STATUS_SERVICE_REPAIRING = 17; - SERVICE_STACK_STATUS_SERVICE_CONTAINER_FAILED = 19; - SERVICE_STACK_STATUS_SERVICE_MOVING_CONTAINER = 20; - SERVICE_STACK_STATUS_SERVICE_UPGRADING = 26; - SERVICE_STACK_STATUS_SERVICE_SCALING = 37; - SERVICE_STACK_STATUS_SERVICE_REPAIR_FAILED = 38; - SERVICE_STACK_STATUS_REPAIRING = 30; - SERVICE_STACK_STATUS_CONTAINER_FAILED = 31; - SERVICE_STACK_STATUS_MOVING_CONTAINER = 32; - SERVICE_STACK_STATUS_SCALING = 33; - SERVICE_STACK_STATUS_REPAIR_FAILED = 34; - -} - -enum ServiceStackTypeCategory { - SERVICE_STACK_TYPE_CATEGORY_UNKNOWN = 0; - SERVICE_STACK_TYPE_CATEGORY_CORE = 1; - SERVICE_STACK_TYPE_CATEGORY_HTTP_L7_BALANCER = 2; - SERVICE_STACK_TYPE_CATEGORY_STANDARD = 3; - SERVICE_STACK_TYPE_CATEGORY_USER = 4; - SERVICE_STACK_TYPE_CATEGORY_SHARED_STORAGE = 5; - SERVICE_STACK_TYPE_CATEGORY_OBJECT_STORAGE = 6; - SERVICE_STACK_TYPE_CATEGORY_BUILD = 7; - SERVICE_STACK_TYPE_CATEGORY_INTERNAL = 8; - SERVICE_STACK_TYPE_CATEGORY_PREPARE_RUNTIME = 9; - -} - -enum UserDataType { - USER_DATA_TYPE_UNKNOWN = 0; - USER_DATA_TYPE_RESTRICTED = 1; - USER_DATA_TYPE_COMMON = 2; - USER_DATA_TYPE_USER = 3; - USER_DATA_TYPE_INTERNAL = 4; - -} - -enum UserDataVersion { - USER_DATA_VERSION_UNKNOWN = 0; - USER_DATA_VERSION_USER = 1; - USER_DATA_VERSION_INFRASTRUCTURE = 2; - -} - -enum UserJsonObjectType { - USER_JSON_OBJECT_TYPE_UNKNOWN = 0; - USER_JSON_OBJECT_TYPE_GITHUB = 1; - USER_JSON_OBJECT_TYPE_GITLAB = 4; - USER_JSON_OBJECT_TYPE_USER = 2; - USER_JSON_OBJECT_TYPE_SYSTEM = 3; - -} - -enum UserStatus { - USER_STATUS_UNKNOWN = 0; - USER_STATUS_ACTIVE = 1; - USER_STATUS_DELETED = 2; - -} - - - -// -// NULL TYPES -// - -message AppVersionBuildNull { - AppVersionBuild value = 1; - bool valid = 2; -} - -message AppVersionGithubIntegrationNull { - AppVersionGithubIntegration value = 1; - bool valid = 2; -} - -message AppVersionGitlabIntegrationNull { - AppVersionGitlabIntegration value = 1; - bool valid = 2; -} - -message AppVersionJsonObjectNull { - AppVersionJsonObject value = 1; - bool valid = 2; -} - -message AppVersionLightNull { - AppVersionLight value = 1; - bool valid = 2; -} - -message AppVersionPublicGitSourceNull { - AppVersionPublicGitSource value = 1; - bool valid = 2; -} - -message ClientAvatarNull { - ClientAvatar value = 1; - bool valid = 2; -} - -message CustomAutoscalingNull { - CustomAutoscaling value = 1; - bool valid = 2; -} - -message GithubIntegrationNull { - GithubIntegration value = 1; - bool valid = 2; -} - -message GitlabIntegrationNull { - GitlabIntegration value = 1; - bool valid = 2; -} - -message HorizontalAutoscalingNull { - HorizontalAutoscaling value = 1; - bool valid = 2; -} - -message Int32Null { - int32 value = 1; - bool valid = 2; -} - -message PrepareCustomRuntimeNull { - PrepareCustomRuntime value = 1; - bool valid = 2; -} - -message StringNull { - string value = 1; - bool valid = 2; -} - -message TimestampNull { - Timestamp value = 1; - bool valid = 2; -} - -message UserAvatarNull { - UserAvatar value = 1; - bool valid = 2; -} - -message UserJsonObjectNull { - UserJsonObject value = 1; - bool valid = 2; -} - -message VerticalAutoscalingNull { - VerticalAutoscaling value = 1; - bool valid = 2; -} diff --git a/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol_grpc.pb.go b/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol_grpc.pb.go deleted file mode 100644 index 58ae43bf..00000000 --- a/src/proto/zBusinessZeropsApiProtocol/zeropsApiProtocol_grpc.pb.go +++ /dev/null @@ -1,755 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.3 -// source: zeropsApiProtocol.proto - -package zBusinessZeropsApiProtocol - -import ( - context "context" - - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ZBusinessZeropsApiProtocolClient is the client API for ZBusinessZeropsApiProtocol service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ZBusinessZeropsApiProtocolClient interface { - PutAppVersionDeploy(ctx context.Context, in *PutAppVersionDeployRequest, opts ...grpc.CallOption) (*PutAppVersionDeployResponse, error) - PutAppVersionBuildAndDeploy(ctx context.Context, in *PutAppVersionBuildAndDeployRequest, opts ...grpc.CallOption) (*PutAppVersionBuildAndDeployResponse, error) - PostAppVersion(ctx context.Context, in *PostAppVersionRequest, opts ...grpc.CallOption) (*PostAppVersionResponse, error) - DeleteProject(ctx context.Context, in *DeleteProjectRequest, opts ...grpc.CallOption) (*DeleteProjectResponse, error) - GetProjectsByName(ctx context.Context, in *GetProjectsByNameRequest, opts ...grpc.CallOption) (*GetProjectsByNameResponse, error) - PutProjectStart(ctx context.Context, in *PutProjectStartRequest, opts ...grpc.CallOption) (*PutProjectStartResponse, error) - PutProjectStop(ctx context.Context, in *PutProjectStopRequest, opts ...grpc.CallOption) (*PutProjectStopResponse, error) - PostProjectImport(ctx context.Context, in *PostProjectImportRequest, opts ...grpc.CallOption) (*PostProjectImportResponse, error) - GetProcess(ctx context.Context, in *GetProcessRequest, opts ...grpc.CallOption) (*GetProcessResponse, error) - PostPublicHttpRouting(ctx context.Context, in *PostPublicHttpRoutingRequest, opts ...grpc.CallOption) (*PostPublicHttpRoutingResponse, error) - GetServiceStack(ctx context.Context, in *GetServiceStackRequest, opts ...grpc.CallOption) (*GetServiceStackResponse, error) - DeleteServiceStack(ctx context.Context, in *DeleteServiceStackRequest, opts ...grpc.CallOption) (*DeleteServiceStackResponse, error) - PutServiceStackStop(ctx context.Context, in *PutServiceStackStopRequest, opts ...grpc.CallOption) (*PutServiceStackStopResponse, error) - PutServiceStackStart(ctx context.Context, in *PutServiceStackStartRequest, opts ...grpc.CallOption) (*PutServiceStackStartResponse, error) - PutServiceStackRestart(ctx context.Context, in *PutServiceStackRestartRequest, opts ...grpc.CallOption) (*PutServiceStackRestartResponse, error) - GetServiceStackByName(ctx context.Context, in *GetServiceStackByNameRequest, opts ...grpc.CallOption) (*GetServiceStackByNameResponse, error) - PostServiceStackImport(ctx context.Context, in *PostServiceStackImportRequest, opts ...grpc.CallOption) (*PostServiceStackImportResponse, error) - GetUserInfo(ctx context.Context, in *GetUserInfoRequest, opts ...grpc.CallOption) (*GetUserInfoResponse, error) - PostVpnRequest(ctx context.Context, in *PostVpnRequestRequest, opts ...grpc.CallOption) (*PostVpnRequestResponse, error) -} - -type zBusinessZeropsApiProtocolClient struct { - cc grpc.ClientConnInterface -} - -func NewZBusinessZeropsApiProtocolClient(cc grpc.ClientConnInterface) ZBusinessZeropsApiProtocolClient { - return &zBusinessZeropsApiProtocolClient{cc} -} - -func (c *zBusinessZeropsApiProtocolClient) PutAppVersionDeploy(ctx context.Context, in *PutAppVersionDeployRequest, opts ...grpc.CallOption) (*PutAppVersionDeployResponse, error) { - out := new(PutAppVersionDeployResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutAppVersionDeploy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PutAppVersionBuildAndDeploy(ctx context.Context, in *PutAppVersionBuildAndDeployRequest, opts ...grpc.CallOption) (*PutAppVersionBuildAndDeployResponse, error) { - out := new(PutAppVersionBuildAndDeployResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutAppVersionBuildAndDeploy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PostAppVersion(ctx context.Context, in *PostAppVersionRequest, opts ...grpc.CallOption) (*PostAppVersionResponse, error) { - out := new(PostAppVersionResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostAppVersion", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) DeleteProject(ctx context.Context, in *DeleteProjectRequest, opts ...grpc.CallOption) (*DeleteProjectResponse, error) { - out := new(DeleteProjectResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/DeleteProject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) GetProjectsByName(ctx context.Context, in *GetProjectsByNameRequest, opts ...grpc.CallOption) (*GetProjectsByNameResponse, error) { - out := new(GetProjectsByNameResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetProjectsByName", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PutProjectStart(ctx context.Context, in *PutProjectStartRequest, opts ...grpc.CallOption) (*PutProjectStartResponse, error) { - out := new(PutProjectStartResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutProjectStart", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PutProjectStop(ctx context.Context, in *PutProjectStopRequest, opts ...grpc.CallOption) (*PutProjectStopResponse, error) { - out := new(PutProjectStopResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutProjectStop", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PostProjectImport(ctx context.Context, in *PostProjectImportRequest, opts ...grpc.CallOption) (*PostProjectImportResponse, error) { - out := new(PostProjectImportResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostProjectImport", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) GetProcess(ctx context.Context, in *GetProcessRequest, opts ...grpc.CallOption) (*GetProcessResponse, error) { - out := new(GetProcessResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetProcess", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PostPublicHttpRouting(ctx context.Context, in *PostPublicHttpRoutingRequest, opts ...grpc.CallOption) (*PostPublicHttpRoutingResponse, error) { - out := new(PostPublicHttpRoutingResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostPublicHttpRouting", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) GetServiceStack(ctx context.Context, in *GetServiceStackRequest, opts ...grpc.CallOption) (*GetServiceStackResponse, error) { - out := new(GetServiceStackResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetServiceStack", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) DeleteServiceStack(ctx context.Context, in *DeleteServiceStackRequest, opts ...grpc.CallOption) (*DeleteServiceStackResponse, error) { - out := new(DeleteServiceStackResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/DeleteServiceStack", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PutServiceStackStop(ctx context.Context, in *PutServiceStackStopRequest, opts ...grpc.CallOption) (*PutServiceStackStopResponse, error) { - out := new(PutServiceStackStopResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutServiceStackStop", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PutServiceStackStart(ctx context.Context, in *PutServiceStackStartRequest, opts ...grpc.CallOption) (*PutServiceStackStartResponse, error) { - out := new(PutServiceStackStartResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutServiceStackStart", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PutServiceStackRestart(ctx context.Context, in *PutServiceStackRestartRequest, opts ...grpc.CallOption) (*PutServiceStackRestartResponse, error) { - out := new(PutServiceStackRestartResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutServiceStackRestart", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) GetServiceStackByName(ctx context.Context, in *GetServiceStackByNameRequest, opts ...grpc.CallOption) (*GetServiceStackByNameResponse, error) { - out := new(GetServiceStackByNameResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetServiceStackByName", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PostServiceStackImport(ctx context.Context, in *PostServiceStackImportRequest, opts ...grpc.CallOption) (*PostServiceStackImportResponse, error) { - out := new(PostServiceStackImportResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostServiceStackImport", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) GetUserInfo(ctx context.Context, in *GetUserInfoRequest, opts ...grpc.CallOption) (*GetUserInfoResponse, error) { - out := new(GetUserInfoResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetUserInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *zBusinessZeropsApiProtocolClient) PostVpnRequest(ctx context.Context, in *PostVpnRequestRequest, opts ...grpc.CallOption) (*PostVpnRequestResponse, error) { - out := new(PostVpnRequestResponse) - err := c.cc.Invoke(ctx, "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostVpnRequest", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ZBusinessZeropsApiProtocolServer is the server API for ZBusinessZeropsApiProtocol service. -// All implementations must embed UnimplementedZBusinessZeropsApiProtocolServer -// for forward compatibility -type ZBusinessZeropsApiProtocolServer interface { - PutAppVersionDeploy(context.Context, *PutAppVersionDeployRequest) (*PutAppVersionDeployResponse, error) - PutAppVersionBuildAndDeploy(context.Context, *PutAppVersionBuildAndDeployRequest) (*PutAppVersionBuildAndDeployResponse, error) - PostAppVersion(context.Context, *PostAppVersionRequest) (*PostAppVersionResponse, error) - DeleteProject(context.Context, *DeleteProjectRequest) (*DeleteProjectResponse, error) - GetProjectsByName(context.Context, *GetProjectsByNameRequest) (*GetProjectsByNameResponse, error) - PutProjectStart(context.Context, *PutProjectStartRequest) (*PutProjectStartResponse, error) - PutProjectStop(context.Context, *PutProjectStopRequest) (*PutProjectStopResponse, error) - PostProjectImport(context.Context, *PostProjectImportRequest) (*PostProjectImportResponse, error) - GetProcess(context.Context, *GetProcessRequest) (*GetProcessResponse, error) - PostPublicHttpRouting(context.Context, *PostPublicHttpRoutingRequest) (*PostPublicHttpRoutingResponse, error) - GetServiceStack(context.Context, *GetServiceStackRequest) (*GetServiceStackResponse, error) - DeleteServiceStack(context.Context, *DeleteServiceStackRequest) (*DeleteServiceStackResponse, error) - PutServiceStackStop(context.Context, *PutServiceStackStopRequest) (*PutServiceStackStopResponse, error) - PutServiceStackStart(context.Context, *PutServiceStackStartRequest) (*PutServiceStackStartResponse, error) - PutServiceStackRestart(context.Context, *PutServiceStackRestartRequest) (*PutServiceStackRestartResponse, error) - GetServiceStackByName(context.Context, *GetServiceStackByNameRequest) (*GetServiceStackByNameResponse, error) - PostServiceStackImport(context.Context, *PostServiceStackImportRequest) (*PostServiceStackImportResponse, error) - GetUserInfo(context.Context, *GetUserInfoRequest) (*GetUserInfoResponse, error) - PostVpnRequest(context.Context, *PostVpnRequestRequest) (*PostVpnRequestResponse, error) - mustEmbedUnimplementedZBusinessZeropsApiProtocolServer() -} - -// UnimplementedZBusinessZeropsApiProtocolServer must be embedded to have forward compatible implementations. -type UnimplementedZBusinessZeropsApiProtocolServer struct { -} - -func (UnimplementedZBusinessZeropsApiProtocolServer) PutAppVersionDeploy(context.Context, *PutAppVersionDeployRequest) (*PutAppVersionDeployResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutAppVersionDeploy not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PutAppVersionBuildAndDeploy(context.Context, *PutAppVersionBuildAndDeployRequest) (*PutAppVersionBuildAndDeployResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutAppVersionBuildAndDeploy not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PostAppVersion(context.Context, *PostAppVersionRequest) (*PostAppVersionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PostAppVersion not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) DeleteProject(context.Context, *DeleteProjectRequest) (*DeleteProjectResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteProject not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) GetProjectsByName(context.Context, *GetProjectsByNameRequest) (*GetProjectsByNameResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetProjectsByName not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PutProjectStart(context.Context, *PutProjectStartRequest) (*PutProjectStartResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutProjectStart not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PutProjectStop(context.Context, *PutProjectStopRequest) (*PutProjectStopResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutProjectStop not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PostProjectImport(context.Context, *PostProjectImportRequest) (*PostProjectImportResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PostProjectImport not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) GetProcess(context.Context, *GetProcessRequest) (*GetProcessResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetProcess not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PostPublicHttpRouting(context.Context, *PostPublicHttpRoutingRequest) (*PostPublicHttpRoutingResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PostPublicHttpRouting not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) GetServiceStack(context.Context, *GetServiceStackRequest) (*GetServiceStackResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetServiceStack not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) DeleteServiceStack(context.Context, *DeleteServiceStackRequest) (*DeleteServiceStackResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteServiceStack not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PutServiceStackStop(context.Context, *PutServiceStackStopRequest) (*PutServiceStackStopResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutServiceStackStop not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PutServiceStackStart(context.Context, *PutServiceStackStartRequest) (*PutServiceStackStartResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutServiceStackStart not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PutServiceStackRestart(context.Context, *PutServiceStackRestartRequest) (*PutServiceStackRestartResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PutServiceStackRestart not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) GetServiceStackByName(context.Context, *GetServiceStackByNameRequest) (*GetServiceStackByNameResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetServiceStackByName not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PostServiceStackImport(context.Context, *PostServiceStackImportRequest) (*PostServiceStackImportResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PostServiceStackImport not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) GetUserInfo(context.Context, *GetUserInfoRequest) (*GetUserInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUserInfo not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) PostVpnRequest(context.Context, *PostVpnRequestRequest) (*PostVpnRequestResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PostVpnRequest not implemented") -} -func (UnimplementedZBusinessZeropsApiProtocolServer) mustEmbedUnimplementedZBusinessZeropsApiProtocolServer() { -} - -// UnsafeZBusinessZeropsApiProtocolServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ZBusinessZeropsApiProtocolServer will -// result in compilation errors. -type UnsafeZBusinessZeropsApiProtocolServer interface { - mustEmbedUnimplementedZBusinessZeropsApiProtocolServer() -} - -func RegisterZBusinessZeropsApiProtocolServer(s grpc.ServiceRegistrar, srv ZBusinessZeropsApiProtocolServer) { - s.RegisterService(&ZBusinessZeropsApiProtocol_ServiceDesc, srv) -} - -func _ZBusinessZeropsApiProtocol_PutAppVersionDeploy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutAppVersionDeployRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutAppVersionDeploy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutAppVersionDeploy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutAppVersionDeploy(ctx, req.(*PutAppVersionDeployRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PutAppVersionBuildAndDeploy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutAppVersionBuildAndDeployRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutAppVersionBuildAndDeploy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutAppVersionBuildAndDeploy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutAppVersionBuildAndDeploy(ctx, req.(*PutAppVersionBuildAndDeployRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PostAppVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PostAppVersionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PostAppVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostAppVersion", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PostAppVersion(ctx, req.(*PostAppVersionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_DeleteProject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteProjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).DeleteProject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/DeleteProject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).DeleteProject(ctx, req.(*DeleteProjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_GetProjectsByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetProjectsByNameRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).GetProjectsByName(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetProjectsByName", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).GetProjectsByName(ctx, req.(*GetProjectsByNameRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PutProjectStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutProjectStartRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutProjectStart(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutProjectStart", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutProjectStart(ctx, req.(*PutProjectStartRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PutProjectStop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutProjectStopRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutProjectStop(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutProjectStop", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutProjectStop(ctx, req.(*PutProjectStopRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PostProjectImport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PostProjectImportRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PostProjectImport(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostProjectImport", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PostProjectImport(ctx, req.(*PostProjectImportRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_GetProcess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetProcessRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).GetProcess(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetProcess", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).GetProcess(ctx, req.(*GetProcessRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PostPublicHttpRouting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PostPublicHttpRoutingRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PostPublicHttpRouting(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostPublicHttpRouting", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PostPublicHttpRouting(ctx, req.(*PostPublicHttpRoutingRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_GetServiceStack_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServiceStackRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).GetServiceStack(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetServiceStack", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).GetServiceStack(ctx, req.(*GetServiceStackRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_DeleteServiceStack_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteServiceStackRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).DeleteServiceStack(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/DeleteServiceStack", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).DeleteServiceStack(ctx, req.(*DeleteServiceStackRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PutServiceStackStop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutServiceStackStopRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutServiceStackStop(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutServiceStackStop", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutServiceStackStop(ctx, req.(*PutServiceStackStopRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PutServiceStackStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutServiceStackStartRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutServiceStackStart(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutServiceStackStart", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutServiceStackStart(ctx, req.(*PutServiceStackStartRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PutServiceStackRestart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PutServiceStackRestartRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PutServiceStackRestart(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PutServiceStackRestart", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PutServiceStackRestart(ctx, req.(*PutServiceStackRestartRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_GetServiceStackByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServiceStackByNameRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).GetServiceStackByName(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetServiceStackByName", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).GetServiceStackByName(ctx, req.(*GetServiceStackByNameRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PostServiceStackImport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PostServiceStackImportRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PostServiceStackImport(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostServiceStackImport", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PostServiceStackImport(ctx, req.(*PostServiceStackImportRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_GetUserInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetUserInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).GetUserInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/GetUserInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).GetUserInfo(ctx, req.(*GetUserInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ZBusinessZeropsApiProtocol_PostVpnRequest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PostVpnRequestRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ZBusinessZeropsApiProtocolServer).PostVpnRequest(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol/PostVpnRequest", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ZBusinessZeropsApiProtocolServer).PostVpnRequest(ctx, req.(*PostVpnRequestRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// ZBusinessZeropsApiProtocol_ServiceDesc is the grpc.ServiceDesc for ZBusinessZeropsApiProtocol service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ZBusinessZeropsApiProtocol_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocol", - HandlerType: (*ZBusinessZeropsApiProtocolServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "PutAppVersionDeploy", - Handler: _ZBusinessZeropsApiProtocol_PutAppVersionDeploy_Handler, - }, - { - MethodName: "PutAppVersionBuildAndDeploy", - Handler: _ZBusinessZeropsApiProtocol_PutAppVersionBuildAndDeploy_Handler, - }, - { - MethodName: "PostAppVersion", - Handler: _ZBusinessZeropsApiProtocol_PostAppVersion_Handler, - }, - { - MethodName: "DeleteProject", - Handler: _ZBusinessZeropsApiProtocol_DeleteProject_Handler, - }, - { - MethodName: "GetProjectsByName", - Handler: _ZBusinessZeropsApiProtocol_GetProjectsByName_Handler, - }, - { - MethodName: "PutProjectStart", - Handler: _ZBusinessZeropsApiProtocol_PutProjectStart_Handler, - }, - { - MethodName: "PutProjectStop", - Handler: _ZBusinessZeropsApiProtocol_PutProjectStop_Handler, - }, - { - MethodName: "PostProjectImport", - Handler: _ZBusinessZeropsApiProtocol_PostProjectImport_Handler, - }, - { - MethodName: "GetProcess", - Handler: _ZBusinessZeropsApiProtocol_GetProcess_Handler, - }, - { - MethodName: "PostPublicHttpRouting", - Handler: _ZBusinessZeropsApiProtocol_PostPublicHttpRouting_Handler, - }, - { - MethodName: "GetServiceStack", - Handler: _ZBusinessZeropsApiProtocol_GetServiceStack_Handler, - }, - { - MethodName: "DeleteServiceStack", - Handler: _ZBusinessZeropsApiProtocol_DeleteServiceStack_Handler, - }, - { - MethodName: "PutServiceStackStop", - Handler: _ZBusinessZeropsApiProtocol_PutServiceStackStop_Handler, - }, - { - MethodName: "PutServiceStackStart", - Handler: _ZBusinessZeropsApiProtocol_PutServiceStackStart_Handler, - }, - { - MethodName: "PutServiceStackRestart", - Handler: _ZBusinessZeropsApiProtocol_PutServiceStackRestart_Handler, - }, - { - MethodName: "GetServiceStackByName", - Handler: _ZBusinessZeropsApiProtocol_GetServiceStackByName_Handler, - }, - { - MethodName: "PostServiceStackImport", - Handler: _ZBusinessZeropsApiProtocol_PostServiceStackImport_Handler, - }, - { - MethodName: "GetUserInfo", - Handler: _ZBusinessZeropsApiProtocol_GetUserInfo_Handler, - }, - { - MethodName: "PostVpnRequest", - Handler: _ZBusinessZeropsApiProtocol_PostVpnRequest_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "zeropsApiProtocol.proto", -} diff --git a/src/region/config.go b/src/region/config.go deleted file mode 100644 index 7354c958..00000000 --- a/src/region/config.go +++ /dev/null @@ -1 +0,0 @@ -package region diff --git a/src/region/region.go b/src/region/region.go index 8147b9c1..65471030 100644 --- a/src/region/region.go +++ b/src/region/region.go @@ -2,12 +2,9 @@ package region import ( "encoding/json" - "errors" "sort" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/httpClient" - "github.com/zeropsio/zcli/src/utils/storage" + "github.com/zeropsio/zcli/src/httpClient" ) type Data struct { @@ -21,41 +18,15 @@ type Data struct { } type Handler struct { - client *httpClient.Handler - storage *storage.Handler[Data] + client *httpClient.Handler } -func New(client *httpClient.Handler, storage *storage.Handler[Data]) *Handler { +func New(client *httpClient.Handler) *Handler { return &Handler{ - storage: storage, - client: client, + client: client, } } -// RetrieveFromURL retrieves the region from URL, if region is empty, returns a default region -func (h *Handler) RetrieveFromURL(regionURL, region string) (Data, error) { - resp, err := h.client.Get(regionURL) - if err != nil { - return Data{}, err - } - reg, err := readRegion(region, resp.Body) - if err != nil { - return Data{}, err - } - return reg, nil -} - -// RetrieveFromURLAndSave retrieves the region using RetrieveFromURL and stores it into the file -func (h *Handler) RetrieveFromURLAndSave(regionURL, region string) (Data, error) { - reg, err := h.RetrieveFromURL(regionURL, region) - if err != nil { - return Data{}, err - } - return h.storage.Update(func(Data) Data { - return reg - }) -} - func (h *Handler) RetrieveAllFromURL(regionURL string) ([]Data, error) { resp, err := h.client.Get(regionURL) if err != nil { @@ -77,35 +48,8 @@ func (h *Handler) RetrieveAllFromURL(regionURL string) ([]Data, error) { return regions, nil } -func (h *Handler) RetrieveFromFile() (Data, error) { - return h.storage.Data(), nil -} - func readRegions(regionFile json.RawMessage) ([]Data, error) { var regions []Data err := json.Unmarshal(regionFile, ®ions) return regions, err } - -func readRegion(region string, regionFile json.RawMessage) (Data, error) { - regions, err := readRegions(regionFile) - if err != nil { - return Data{}, err - } - var reg *Data - for _, r := range regions { - r := r - if r.IsDefault && region == "" { - reg = &r - } - if r.Name == region { - reg = &r - } - } - - if reg == nil { - return Data{}, errors.New(i18n.RegionNotFound) - } - - return *reg, nil -} diff --git a/src/cliAction/serviceLogs/constants.go b/src/serviceLogs/constants.go similarity index 83% rename from src/cliAction/serviceLogs/constants.go rename to src/serviceLogs/constants.go index d7f89087..670ad3a4 100644 --- a/src/cliAction/serviceLogs/constants.go +++ b/src/serviceLogs/constants.go @@ -4,7 +4,6 @@ const BUILD = "BUILD" const RUNTIME = "RUNTIME" const RESPONSE = "RESPONSE" const STREAM = "STREAM" -const USER = "SERVICE_STACK_TYPE_CATEGORY_USER" const APPLICATION = "APPLICATION" const WEBSERVER = "WEBSERVER" const FULL = "FULL" @@ -12,7 +11,6 @@ const SHORT = "SHORT" const JSON = "JSON" const JSONSTREAM = "JSONSTREAM" const AT = "@" -const UPLOADING = "UPLOADING" const HTTPS = "https://" const WSS = "wss://" const RFC5424 = "5424" diff --git a/src/serviceLogs/handler.go b/src/serviceLogs/handler.go new file mode 100644 index 00000000..bbe38495 --- /dev/null +++ b/src/serviceLogs/handler.go @@ -0,0 +1,39 @@ +package serviceLogs + +import ( + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type Config struct { +} + +type Levels [8][2]string + +type RunConfig struct { + Project entity.Project + ServiceId uuid.ServiceStackId + Container entity.Container + Limit uint32 + MinSeverity string + MsgType string + Format string + FormatTemplate string + Follow bool + Levels Levels +} + +type Handler struct { + config Config + restApiClient *zeropsRestApiClient.Handler + + lastMsgId string +} + +func New(config Config, restApiClient *zeropsRestApiClient.Handler) *Handler { + return &Handler{ + config: config, + restApiClient: restApiClient, + } +} diff --git a/src/cliAction/serviceLogs/handler_checkInputValues.go b/src/serviceLogs/handler_checkInputValues.go similarity index 80% rename from src/cliAction/serviceLogs/handler_checkInputValues.go rename to src/serviceLogs/handler_checkInputValues.go index 86dc2f15..f706a394 100644 --- a/src/cliAction/serviceLogs/handler_checkInputValues.go +++ b/src/serviceLogs/handler_checkInputValues.go @@ -6,6 +6,7 @@ import ( "strconv" "strings" + "github.com/pkg/errors" "github.com/zeropsio/zcli/src/i18n" ) @@ -40,7 +41,7 @@ func (h *Handler) checkInputValues(config RunConfig) (inputValues InputValues, e if config.Follow { mode = STREAM if format == JSON { - return inputValues, fmt.Errorf("%s", i18n.LogFormatStreamMismatch) + return inputValues, errors.New(i18n.T(i18n.LogFormatStreamMismatch)) } } return InputValues{ @@ -57,7 +58,7 @@ func (h *Handler) getLimit(config RunConfig) (limit uint32, err error) { limit = config.Limit if limit < 1 || limit > 1000 { - err = fmt.Errorf("%s", i18n.LogLimitInvalid) + err = errors.New(i18n.T(i18n.LogLimitInvalid)) return limit, err } @@ -78,9 +79,9 @@ func (h *Handler) getMinSeverity(config RunConfig) (intVal int, err error) { } intVal, err = strconv.Atoi(ms) if err != nil { - return 1, fmt.Errorf("%s %s", i18n.LogMinSeverityInvalid, i18n.LogMinSeverityStringLimitErr) + return 1, fmt.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityStringLimitErr)) } - return 1, fmt.Errorf("%s %s", i18n.LogMinSeverityInvalid, i18n.LogMinSeverityNumLimitErr) + return 1, fmt.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityNumLimitErr)) } // getFacility returns facility number based on msgType @@ -92,20 +93,20 @@ func (h *Handler) getFacility(config RunConfig) (int, error) { if mt == WEBSERVER { return 17, nil } - return 16, fmt.Errorf("%s", i18n.LogMsgTypeInvalid) + return 16, errors.New(i18n.T(i18n.LogMsgTypeInvalid)) } func (h *Handler) getFormat(config RunConfig) (string, string, error) { f, ft := strings.ToUpper(config.Format), config.FormatTemplate formatValid := f == FULL || f == SHORT || f == JSON || f == JSONSTREAM if !formatValid { - return "", "", fmt.Errorf("%s", i18n.LogFormatInvalid) + return "", "", errors.New(i18n.T(i18n.LogFormatInvalid)) } if ft == "" { return f, ft, nil } if f != FULL { - return "", "", fmt.Errorf("%s", i18n.LogFormatTemplateMismatch) + return "", "", errors.New(i18n.T(i18n.LogFormatTemplateMismatch)) } formatTemplate, err := h.checkFormat(ft) if err != nil { @@ -117,7 +118,7 @@ func (h *Handler) getFormat(config RunConfig) (string, string, error) { // e.g. --formatTemplate="{{.timestamp}} {{.priority}} {{.facility}} {{.message}}" func (h *Handler) checkFormat(ft string) (string, error) { if err := validateTemplate(ft); err != nil { - return "", fmt.Errorf("%s %s", i18n.LogFormatTemplateInvalid, err) + return "", fmt.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), err) } return ft, nil } diff --git a/src/cliAction/serviceLogs/handler_formatByRfc.go b/src/serviceLogs/handler_formatByRfc.go similarity index 100% rename from src/cliAction/serviceLogs/handler_formatByRfc.go rename to src/serviceLogs/handler_formatByRfc.go diff --git a/src/cliAction/serviceLogs/handler_formatByTemplate.go b/src/serviceLogs/handler_formatByTemplate.go similarity index 89% rename from src/cliAction/serviceLogs/handler_formatByTemplate.go rename to src/serviceLogs/handler_formatByTemplate.go index 386eb190..0536fc3c 100644 --- a/src/cliAction/serviceLogs/handler_formatByTemplate.go +++ b/src/serviceLogs/handler_formatByTemplate.go @@ -20,7 +20,7 @@ func getFullWithTemplate(logData []Data, formatTemplate string) error { for _, o := range logData { err := formatDataByTemplate(o, ft) if err != nil { - return fmt.Errorf("%s %s", i18n.LogFormatTemplateInvalid, err) + return fmt.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), err) } } return nil @@ -46,7 +46,7 @@ func testTokens(tokens []string) error { // if any `{` characters are left, it means the items were not split by correctly rmLeft := strings.Replace(token, "{", "", 2) if strings.Contains(rmLeft, "{") { - return fmt.Errorf("%s %s", i18n.LogFormatTemplateInvalid, i18n.LogFormatTemplateNoSpace) + return fmt.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), i18n.T(i18n.LogFormatTemplateNoSpace)) } } return nil diff --git a/src/cliAction/serviceLogs/handler_formatByTemplate_test.go b/src/serviceLogs/handler_formatByTemplate_test.go similarity index 100% rename from src/cliAction/serviceLogs/handler_formatByTemplate_test.go rename to src/serviceLogs/handler_formatByTemplate_test.go diff --git a/src/cliAction/serviceLogs/handler_formatLogs.go b/src/serviceLogs/handler_formatLogs.go similarity index 100% rename from src/cliAction/serviceLogs/handler_formatLogs.go rename to src/serviceLogs/handler_formatLogs.go diff --git a/src/cliAction/serviceLogs/handler_getLogs.go b/src/serviceLogs/handler_getLogs.go similarity index 100% rename from src/cliAction/serviceLogs/handler_getLogs.go rename to src/serviceLogs/handler_getLogs.go diff --git a/src/serviceLogs/handler_getServiceLogUrl.go b/src/serviceLogs/handler_getServiceLogUrl.go new file mode 100644 index 00000000..34e5d098 --- /dev/null +++ b/src/serviceLogs/handler_getServiceLogUrl.go @@ -0,0 +1,35 @@ +package serviceLogs + +import ( + "context" + "fmt" + "strings" + + "github.com/zeropsio/zerops-go/dto/output" + + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func (h *Handler) getServiceLogResData(ctx context.Context, projectId uuid.ProjectId) (string, string, error) { + response, err := h.restApiClient.GetProjectLog(ctx, path.ProjectId{Id: projectId}) + if err != nil { + return "", "", err + } + + resOutput, err := response.Output() + if err != nil { + return "", "", fmt.Errorf("%s %v", i18n.T(i18n.LogAccessFailed), err) + } + method, url := getLogRequestData(resOutput) + return method, url, nil +} + +func getLogRequestData(resOutput output.ProjectLog) (string, string) { + outputUrl := string(resOutput.Url) + urlData := strings.Split(outputUrl, " ") + method, url := urlData[0], urlData[1] + + return method, url +} diff --git a/src/cliAction/serviceLogs/handler_printLogs.go b/src/serviceLogs/handler_printLogs.go similarity index 59% rename from src/cliAction/serviceLogs/handler_printLogs.go rename to src/serviceLogs/handler_printLogs.go index 0141d9df..006f6900 100644 --- a/src/cliAction/serviceLogs/handler_printLogs.go +++ b/src/serviceLogs/handler_printLogs.go @@ -4,15 +4,23 @@ import ( "context" "fmt" "strings" + + "github.com/zeropsio/zerops-go/types/uuid" ) -func (h *Handler) printLogs(ctx context.Context, config RunConfig, inputs InputValues, containerId, logServiceId, projectId string) error { - method, url, err := h.getServiceLogResData(ctx, h.sdkConfig, projectId) +func (h *Handler) printLogs( + ctx context.Context, + inputs InputValues, + projectId uuid.ProjectId, + serviceId uuid.ServiceStackId, + containerId uuid.ContainerId, +) error { + method, url, err := h.getServiceLogResData(ctx, projectId) if err != nil { return err } - query := makeQueryParams(inputs, logServiceId, containerId) + query := makeQueryParams(inputs, serviceId, containerId) if inputs.mode == RESPONSE { err = getLogs(ctx, method, HTTPS+url+query, inputs.format, inputs.formatTemplate, inputs.mode) @@ -22,7 +30,7 @@ func (h *Handler) printLogs(ctx context.Context, config RunConfig, inputs InputV } if inputs.mode == STREAM { wsUrl := getWsUrl(url) - err := h.getLogStream(ctx, config, inputs, wsUrl, query, containerId, logServiceId, projectId) + err := h.getLogStream(ctx, inputs, projectId, serviceId, containerId, wsUrl, query) if err != nil { return err } @@ -30,9 +38,9 @@ func (h *Handler) printLogs(ctx context.Context, config RunConfig, inputs InputV return nil } -func makeQueryParams(inputs InputValues, logServiceId, containerId string) string { +func makeQueryParams(inputs InputValues, serviceId uuid.ServiceStackId, containerId uuid.ContainerId) string { query := fmt.Sprintf("&limit=%d&desc=%d&facility=%d&serviceStackId=%s", - inputs.limit, getDesc(inputs.mode), inputs.facility, logServiceId) + inputs.limit, getDesc(inputs.mode), inputs.facility, serviceId) if inputs.minSeverity != -1 { query += fmt.Sprintf("&minimumSeverity=%d", inputs.minSeverity) diff --git a/src/serviceLogs/handler_run.go b/src/serviceLogs/handler_run.go new file mode 100644 index 00000000..49530125 --- /dev/null +++ b/src/serviceLogs/handler_run.go @@ -0,0 +1,19 @@ +package serviceLogs + +import ( + "context" +) + +func (h *Handler) Run(ctx context.Context, config RunConfig) error { + inputs, err := h.checkInputValues(config) + if err != nil { + return err + } + + // FIXME - janhajek check empty containerID + if err = h.printLogs(ctx, inputs, config.Project.ID, config.ServiceId, config.Container.ID); err != nil { + return err + } + + return nil +} diff --git a/src/cliAction/serviceLogs/handler_ws.go b/src/serviceLogs/handler_ws.go similarity index 81% rename from src/cliAction/serviceLogs/handler_ws.go rename to src/serviceLogs/handler_ws.go index 4707260f..a8fa1353 100644 --- a/src/cliAction/serviceLogs/handler_ws.go +++ b/src/serviceLogs/handler_ws.go @@ -3,16 +3,23 @@ package serviceLogs import ( "context" "fmt" - "github.com/gorilla/websocket" - "github.com/zeropsio/zcli/src/i18n" "os" "os/signal" "strings" "time" + + "github.com/gorilla/websocket" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zerops-go/types/uuid" ) func (h *Handler) getLogStream( - ctx context.Context, config RunConfig, inputs InputValues, uri, query, containerId, logServiceId, projectId string, + ctx context.Context, + inputs InputValues, + projectId uuid.ProjectId, + serviceId uuid.ServiceStackId, + containerId uuid.ContainerId, + uri, query string, ) error { url := h.updateUri(uri, query) @@ -21,7 +28,7 @@ func (h *Handler) getLogStream( conn, _, err := websocket.DefaultDialer.Dial(url, nil) if err != nil { - return fmt.Errorf("%s %s\n", i18n.LogReadingFailed, err.Error()) + return fmt.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) } defer conn.Close() @@ -39,7 +46,7 @@ func (h *Handler) getLogStream( return nil } // otherwise try to reconnect the websocket - err := h.printLogs(ctx, config, inputs, containerId, logServiceId, projectId) + err := h.printLogs(ctx, inputs, projectId, serviceId, containerId) if err != nil { return err } @@ -63,8 +70,8 @@ func (h *Handler) getLogStream( // check last message id, add it to `from` and update the ws url for reconnect func (h *Handler) updateUri(uri, query string) string { from := "" - if h.LastMsgId != "" { - from = fmt.Sprintf("&from=%s", h.LastMsgId) + if h.lastMsgId != "" { + from = fmt.Sprintf("&from=%s", h.lastMsgId) } return WSS + uri + query + from } @@ -82,7 +89,7 @@ func (h *Handler) receiveHandler(connection *websocket.Conn, format string, done } finishedByUser := strings.Contains(err.Error(), "use of closed network connection") if !finishedByUser { - errMsg := fmt.Errorf("%s %s\n", i18n.LogReadingFailed, err.Error()) + errMsg := fmt.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) fmt.Println(errMsg) } return @@ -97,7 +104,7 @@ func (h *Handler) printStreamLog(data []byte, format string) { // only if there is a new message coming if len(jsonData.Items) > 0 { //update last msg ID for ws reconnection - h.LastMsgId = jsonData.Items[len(jsonData.Items)-1].Id + h.lastMsgId = jsonData.Items[len(jsonData.Items)-1].Id err := parseResponseByFormat(jsonData, format, "", STREAM) if err != nil { fmt.Println(err.Error()) diff --git a/src/utils/exists.go b/src/storage/exists.go similarity index 92% rename from src/utils/exists.go rename to src/storage/exists.go index 0aaea23e..ca85b772 100644 --- a/src/utils/exists.go +++ b/src/storage/exists.go @@ -1,4 +1,4 @@ -package utils +package storage import ( "os" diff --git a/src/utils/storage/handler.go b/src/storage/handler.go similarity index 72% rename from src/utils/storage/handler.go rename to src/storage/handler.go index d5d2338a..a15466b8 100644 --- a/src/utils/storage/handler.go +++ b/src/storage/handler.go @@ -3,10 +3,9 @@ package storage import ( "encoding/json" "os" - "path/filepath" "sync" - "github.com/zeropsio/zcli/src/utils" + "github.com/pkg/errors" ) type Config struct { @@ -28,16 +27,9 @@ func New[T any](config Config) (*Handler[T], error) { } func (h *Handler[T]) load() error { - - dir := filepath.Dir(h.config.FilePath) - err := os.MkdirAll(dir, 0700) + storageFileExists, err := FileExists(h.config.FilePath) if err != nil { - return err - } - - storageFileExists, err := utils.FileExists(h.config.FilePath) - if err != nil { - return err + return errors.WithStack(err) } if !storageFileExists { return nil @@ -45,12 +37,22 @@ func (h *Handler[T]) load() error { f, err := os.Open(h.config.FilePath) if err != nil { - return err + return errors.WithStack(err) } defer f.Close() + // If the file is empty, set the default value and save it. + fi, err := f.Stat() + if err != nil { + return errors.WithStack(err) + } + if fi.Size() == 0 { + return h.Clear() + } + if err := json.NewDecoder(f).Decode(&h.data); err != nil { - return err + // FIXME - janhajek translation + return errors.WithMessagef(err, "Unable to decode json file %s", h.config.FilePath) } return nil @@ -76,19 +78,19 @@ func (h *Handler[T]) save(data T) error { if err := func() error { f, err := os.Create(h.config.FilePath + ".new") if err != nil { - return err + return errors.WithStack(err) } defer f.Close() if err := json.NewEncoder(f).Encode(data); err != nil { - return err + return errors.WithStack(err) } return nil }(); err != nil { return err } if err := os.Rename(h.config.FilePath+".new", h.config.FilePath); err != nil { - return err + return errors.WithStack(err) } os.Remove(h.config.FilePath + ".new") return nil diff --git a/src/utils/storage/handler_test.go b/src/storage/handler_test.go similarity index 100% rename from src/utils/storage/handler_test.go rename to src/storage/handler_test.go diff --git a/src/support/support.go b/src/support/support.go index 11b3aa71..b482da65 100644 --- a/src/support/support.go +++ b/src/support/support.go @@ -3,7 +3,7 @@ package support import ( "context" - "github.com/zeropsio/zcli/src/utils/uuid" + "github.com/zeropsio/zcli/src/uuid" ) type supportID struct{} diff --git a/src/utils/logger/handler.go b/src/utils/logger/handler.go deleted file mode 100644 index 54b62c7a..00000000 --- a/src/utils/logger/handler.go +++ /dev/null @@ -1,75 +0,0 @@ -package logger - -import ( - "io/ioutil" - "os" - "path/filepath" - - "github.com/sirupsen/logrus" -) - -type Config struct { - FilePath string -} - -type Handler struct { - config Config - - logrus *logrus.Logger -} - -func New(config Config) (*Handler, error) { - - dir := filepath.Dir(config.FilePath) - err := os.MkdirAll(dir, 0755) - if err != nil { - return nil, err - } - - l := logrus.New() - l.Out = ioutil.Discard - l.Level = logrus.DebugLevel - l.AddHook(&StdoutHook{levels: []logrus.Level{logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel}}) - l.AddHook(&VarLogHook{ - path: config.FilePath, - levels: []logrus.Level{logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel}, - }) - - return &Handler{ - config: config, - - logrus: l, - }, nil -} - -func (h *Handler) Info(a ...interface{}) { - h.logrus.Info(a...) -} - -func (h *Handler) Infof(format string, a ...interface{}) { - h.logrus.Infof(format, a...) -} - -func (h *Handler) Warning(a ...interface{}) { - h.logrus.Warning(a...) -} - -func (h *Handler) Warningf(format string, a ...interface{}) { - h.logrus.Warningf(format, a...) -} - -func (h *Handler) Error(a ...interface{}) { - h.logrus.Error(a...) -} - -func (h *Handler) Errorf(format string, a ...interface{}) { - h.logrus.Errorf(format, a...) -} - -func (h *Handler) Debug(a ...interface{}) { - h.logrus.Debug(a...) -} - -func (h *Handler) Debugf(format string, a ...interface{}) { - h.logrus.Debugf(format, a...) -} diff --git a/src/utils/processChecker/checkMultiple.go b/src/utils/processChecker/checkMultiple.go deleted file mode 100644 index 87191f8d..00000000 --- a/src/utils/processChecker/checkMultiple.go +++ /dev/null @@ -1,87 +0,0 @@ -package processChecker - -import ( - "context" - "fmt" - "os" - "strings" - "sync" - "time" - - "github.com/briandowns/spinner" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func CheckMultiple(ctx context.Context, process []string, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, wg *sync.WaitGroup, sp *spinner.Spinner) { - processId, name := getProcessData(process) - isRunning := false - - s := spinner.New(spinner.CharSets[32], 100*time.Millisecond) - s.HideCursor = true - defer wg.Done() - - for { - select { - case <-ctx.Done(): - return - default: - getProcessResponse, err := apiGrpcClient.GetProcess(ctx, &zBusinessZeropsApiProtocol.GetProcessRequest{ - Id: processId, - }) - if err := proto.BusinessError(getProcessResponse, err); err != nil { - fmt.Printf("\n%s failed: %v", name, err) - return - } - - processStatus := getProcessResponse.GetOutput().GetStatus() - - if processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_RUNNING { - if !isRunning { - // stop initial progress indicator that waits for first running process - if sp.Active() { - sp.Stop() - fmt.Println(i18n.ReadyToImportServices) - } - clearLine() - fmt.Printf("%s%s %s \n", constants.Starting, name, i18n.ProcessStart) - isRunning = true - // start current service progress indicator - s.Start() - } - } - - if processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_FINISHED { - s.Stop() - clearLine() - fmt.Printf("%s%s %s\n", constants.Success, name, i18n.ProcessEnd) - return - } - - if !(processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_RUNNING || - processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_PENDING) { - s.Stop() - clearLine() - fmt.Printf("! %s %s %s\n", name, i18n.ProcessInvalidStateProcess, processId) - return - } - time.Sleep(time.Second) - } - } -} - -// clear process indicator leftover when interrupted by another process -func clearLine() { - // 6 spaces equals max number of | chars in spinner to work for Windows - _, _ = fmt.Fprint(os.Stdout, "\r \r") -} - -func getProcessData(process []string) (string, string) { - processId := process[0] - action := strings.Split(process[2], ".")[1] // stack.actionName => actionName - name := process[1] + " " + action // e.g. app create - return processId, name -} diff --git a/src/utils/processChecker/checkProcess.go b/src/utils/processChecker/checkProcess.go deleted file mode 100644 index 61642201..00000000 --- a/src/utils/processChecker/checkProcess.go +++ /dev/null @@ -1,45 +0,0 @@ -package processChecker - -import ( - "context" - "fmt" - "time" - - "github.com/briandowns/spinner" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func CheckProcess(ctx context.Context, processId string, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient) error { - sp := spinner.New(spinner.CharSets[32], 100*time.Millisecond) - sp.Start() - defer sp.Stop() - - for { - select { - case <-ctx.Done(): - return nil - default: - getProcessResponse, err := apiGrpcClient.GetProcess(ctx, &zBusinessZeropsApiProtocol.GetProcessRequest{ - Id: processId, - }) - if err := proto.BusinessError(getProcessResponse, err); err != nil { - return err - } - - processStatus := getProcessResponse.GetOutput().GetStatus() - - if processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_FINISHED { - return nil - } - - if !(processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_RUNNING || - processStatus == zBusinessZeropsApiProtocol.ProcessStatus_PROCESS_STATUS_PENDING) { - return fmt.Errorf(i18n.ProcessInvalidState, getProcessResponse.GetOutput().GetId()) - } - time.Sleep(time.Second) - } - } -} diff --git a/src/utils/projectService/getClientId.go b/src/utils/projectService/getClientId.go deleted file mode 100644 index 8c3842c1..00000000 --- a/src/utils/projectService/getClientId.go +++ /dev/null @@ -1,38 +0,0 @@ -package projectService - -import ( - "context" - "errors" - "fmt" - "strings" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func GetClientId(ctx context.Context, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient) (string, error) { - res, err := apiGrpcClient.GetUserInfo(ctx, &zBusinessZeropsApiProtocol.GetUserInfoRequest{}) - if err := proto.BusinessError(res, err); err != nil { - return "", err - } - clients := res.GetOutput().GetClientUserList() - - if len(clients) == 0 { - return "", errors.New(i18n.MissingClientId) - } - - if len(clients) > 1 { - var out []string - - for _, client := range clients { - out = append(out, client.ClientId) - } - idList := strings.Join(out, ",") - errMsg := fmt.Errorf("%s\n%s%s", i18n.MultipleClientIds, i18n.AvailableClientIds, idList) - - return "", errMsg - } - - return clients[0].ClientId, nil -} diff --git a/src/utils/projectService/getProjectById.go b/src/utils/projectService/getProjectById.go deleted file mode 100644 index 8753e051..00000000 --- a/src/utils/projectService/getProjectById.go +++ /dev/null @@ -1,40 +0,0 @@ -package projectService - -import ( - "context" - "fmt" - "net/http" - "time" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/sdkConfig" - "github.com/zeropsio/zerops-go/apiError" - "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/errorCode" - "github.com/zeropsio/zerops-go/sdk" - "github.com/zeropsio/zerops-go/sdkBase" - "github.com/zeropsio/zerops-go/types/uuid" -) - -func getById(ctx context.Context, sdkConfig sdkConfig.Config, projectId string) (string, error) { - zdk := sdk.New( - sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(sdkConfig.RegionUrl)), - &http.Client{Timeout: 1 * time.Minute}, - ) - - authorizedSdk := sdk.AuthorizeSdk(zdk, sdkConfig.Token) - projectResponse, err := authorizedSdk.GetProject(ctx, path.ProjectId{Id: uuid.ProjectId(projectId)}) - if err != nil { - return "", err - } - - project, err := projectResponse.Output() - if err != nil { - if apiError.HasErrorCode(err, errorCode.ProjectNotFound) { - return "", fmt.Errorf("%s. %s", i18n.ProjectNotFound, i18n.ProjectWrongId) - } - return "", err - } - - return string(project.Id), nil -} diff --git a/src/utils/projectService/getProjectId.go b/src/utils/projectService/getProjectId.go deleted file mode 100644 index 61df3bc0..00000000 --- a/src/utils/projectService/getProjectId.go +++ /dev/null @@ -1,67 +0,0 @@ -package projectService - -import ( - "context" - "errors" - "fmt" - "strings" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "github.com/zeropsio/zcli/src/utils/sdkConfig" -) - -func GetProjectId(ctx context.Context, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, projectNameOrId string, sdkConfig sdkConfig.Config) (string, error) { - if projectNameOrId == "" { - return "", errors.New(i18n.ProjectNameOrIdEmpty) - } - - projects, err := getByName(ctx, apiGrpcClient, projectNameOrId) - if err != nil { - return "", err - } - - if len(projects) > 1 { - return "", getProjectSameNameErr(projects) - } - - if len(projects) == 1 { - return projects[0].GetId(), nil - } - - if len(projectNameOrId) != 22 { - return "", errors.New(i18n.ProjectNotFound) - } - - projectId, err := getById(ctx, sdkConfig, projectNameOrId) - if err != nil { - return "", err - } - - return projectId, nil -} - -func getByName(ctx context.Context, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, projectName string) ([]*zBusinessZeropsApiProtocol.Project, error) { - projectsResponse, err := apiGrpcClient.GetProjectsByName(ctx, &zBusinessZeropsApiProtocol.GetProjectsByNameRequest{ - Name: projectName, - }) - if err := proto.BusinessError(projectsResponse, err); err != nil { - return nil, err - } - projects := projectsResponse.GetOutput().GetProjects() - return projects, nil -} - -// return project IDs hint for projects with the same name -func getProjectSameNameErr(projects []*zBusinessZeropsApiProtocol.Project) error { - out := make([]string, len(projects)) - for i, p := range projects { - out[i] = p.GetId() - } - - idList := strings.Join(out, ", ") - errMsg := fmt.Errorf("%s\n%s%s", i18n.ProjectsWithSameName, i18n.AvailableProjectIds, idList) - - return errMsg -} diff --git a/src/utils/projectService/getService.go b/src/utils/projectService/getService.go deleted file mode 100644 index 78646178..00000000 --- a/src/utils/projectService/getService.go +++ /dev/null @@ -1,41 +0,0 @@ -package projectService - -import ( - "context" - "errors" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" -) - -func GetServiceStack(ctx context.Context, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, projectId string, serviceName string) (*zBusinessZeropsApiProtocol.GetServiceStackByNameResponseDto, error) { - if serviceName == "" { - return nil, errors.New(i18n.ServiceNameIsEmpty) - } - - response, err := apiGrpcClient.GetServiceStackByName(ctx, &zBusinessZeropsApiProtocol.GetServiceStackByNameRequest{ - ProjectId: projectId, - Name: serviceName, - }) - if err := proto.BusinessError(response, err); err != nil { - return nil, err - } - - return response.GetOutput(), nil -} - -func GetServiceId(ctx context.Context, apiGrpcClient zBusinessZeropsApiProtocol.ZBusinessZeropsApiProtocolClient, projectId string, serviceName string) (string, error) { - service, err := GetServiceStack(ctx, apiGrpcClient, projectId, serviceName) - if err != nil { - return "", err - } - - id := service.GetId() - - if len(id) == 0 { - return "", errors.New(i18n.ServiceNotFound) - } - - return id, nil -} diff --git a/src/utils/rw.go b/src/utils/rw.go deleted file mode 100644 index 806f0444..00000000 --- a/src/utils/rw.go +++ /dev/null @@ -1,84 +0,0 @@ -package utils - -import ( - "bufio" - "io" - "os" -) - -func SetFirstLine(path string, firstLine string) error { - lines, err := ReadLines(path) - if err != nil { - return err - } - if len(lines) == 0 || lines[0] != firstLine { - lines = append([]string{firstLine}, lines...) - err := WriteLines(path, lines) - if err != nil { - return err - } - } - - return nil -} - -func RemoveFirstLine(path string, firstLine string) error { - lines, err := ReadLines(path) - if err != nil { - return err - } - if len(lines) > 0 && lines[0] == firstLine { - lines = lines[1:] - err := WriteLines(path, lines) - if err != nil { - return err - } - } - - return nil -} - -func ReadLines(path string) (lines []string, err error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - rd := bufio.NewReader(f) - - for { - lineB, _, err := rd.ReadLine() - line := string(lineB) - - if err == io.EOF { - if line != "" { - lines = append(lines, line) - } - break - } - if err != nil { - return nil, err - } - - lines = append(lines, line) - } - - return -} - -func WriteLines(path string, lines []string) (err error) { - f, err := os.Create(path) - if err != nil { - return err - } - defer f.Close() - - for _, line := range lines { - if _, err = f.WriteString(line + "\n"); err != nil { - return err - } - } - - return nil -} diff --git a/src/utils/sdkConfig/handler.go b/src/utils/sdkConfig/handler.go deleted file mode 100644 index ce2656f0..00000000 --- a/src/utils/sdkConfig/handler.go +++ /dev/null @@ -1,6 +0,0 @@ -package sdkConfig - -type Config struct { - Token string - RegionUrl string -} diff --git a/src/utils/vpnStatus.go b/src/utils/vpnStatus.go deleted file mode 100644 index 4a16e595..00000000 --- a/src/utils/vpnStatus.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "fmt" - - "github.com/zeropsio/zcli/src/proto/daemon" - - "github.com/zeropsio/zcli/src/i18n" -) - -func PrintVpnStatus(vpnStatus *daemon.VpnStatus) { - switch vpnStatus.GetTunnelState() { - case daemon.TunnelState_TUNNEL_ACTIVE: - fmt.Println(i18n.VpnStatusTunnelStatusActive) - case daemon.TunnelState_TUNNEL_SET_INACTIVE: - fmt.Println(i18n.VpnStatusTunnelStatusSetInactive) - } - - if vpnStatus.GetTunnelState() == daemon.TunnelState_TUNNEL_ACTIVE { - switch vpnStatus.GetDnsState() { - case daemon.DnsState_DNS_ACTIVE: - fmt.Println(i18n.VpnStatusDnsStatusActive) - case daemon.DnsState_DNS_SET_INACTIVE: - fmt.Println(i18n.VpnStatusDnsStatusSetInactive) - } - } - if vpnStatus.GetAdditionalInfo() != "" { - fmt.Println(i18n.VpnStatusAdditionalInfo) - fmt.Println(vpnStatus.GetAdditionalInfo()) - } -} diff --git a/src/utils/uuid/uuid.go b/src/uuid/uuid.go similarity index 82% rename from src/utils/uuid/uuid.go rename to src/uuid/uuid.go index ef322e42..a8fb7410 100644 --- a/src/utils/uuid/uuid.go +++ b/src/uuid/uuid.go @@ -3,7 +3,7 @@ package uuid import ( "encoding/base64" - uuid "github.com/satori/go.uuid" + "github.com/google/uuid" ) const encodeUUID = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB" @@ -11,6 +11,6 @@ const encodeUUID = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567 var encoding = base64.NewEncoding(encodeUUID) func GetShort() string { - x := uuid.NewV4() + x := uuid.New() return encoding.EncodeToString(x[:])[0:22] } diff --git a/src/uxBlock/blocks.go b/src/uxBlock/blocks.go new file mode 100644 index 00000000..fc4cca1c --- /dev/null +++ b/src/uxBlock/blocks.go @@ -0,0 +1,36 @@ +// Package uxBlock provides building blocks for UX and communication with a user. +package uxBlock + +import ( + "context" + + "github.com/zeropsio/zcli/src/logger" +) + +type UxBlocks struct { + isTerminal bool + outputLogger logger.Logger + debugFileLogger logger.Logger + + // FIXME - janhajek comment + ctxCancel context.CancelFunc +} + +func NewBlock( + outputLogger logger.Logger, + debugFileLogger logger.Logger, + isTerminal bool, + ctxCancel context.CancelFunc, +) *UxBlocks { + // safety check + if ctxCancel == nil { + ctxCancel = func() {} + } + + return &UxBlocks{ + outputLogger: outputLogger, + debugFileLogger: debugFileLogger, + isTerminal: isTerminal, + ctxCancel: ctxCancel, + } +} diff --git a/src/uxBlock/logs.go b/src/uxBlock/logs.go new file mode 100644 index 00000000..f9b5e1f6 --- /dev/null +++ b/src/uxBlock/logs.go @@ -0,0 +1,40 @@ +package uxBlock + +func (b *UxBlocks) PrintLine(values ...interface{}) { + b.info(values...) +} + +func (b *UxBlocks) PrintSuccessLine(values ...string) { + b.info(SuccessIcon, successColor.SetString(values...)) +} + +func (b *UxBlocks) PrintInfoLine(values ...string) { + b.info(InfoIcon, infoColor.SetString(values...)) +} + +func (b *UxBlocks) PrintWarningLine(values ...string) { + b.warning(WarningIcon, warningColor.SetString(values...)) +} + +func (b *UxBlocks) PrintErrorLine(values ...string) { + b.error(ErrorIcon, errorColor.SetString(values...)) +} + +func (b *UxBlocks) PrintDebugLine(args ...interface{}) { + b.debugFileLogger.Debug(NewLine(args...).DisableStyle()) +} + +func (b *UxBlocks) info(args ...interface{}) { + b.outputLogger.Info(NewLine(args...)) + b.debugFileLogger.Info(NewLine(args...).DisableStyle()) +} + +func (b *UxBlocks) warning(args ...interface{}) { + b.outputLogger.Warning(NewLine(args...)) + b.debugFileLogger.Warning(NewLine(args...).DisableStyle()) +} + +func (b *UxBlocks) error(args ...interface{}) { + b.outputLogger.Error(NewLine(args...)) + b.debugFileLogger.Error(NewLine(args...).DisableStyle()) +} diff --git a/src/uxBlock/prompt.go b/src/uxBlock/prompt.go new file mode 100644 index 00000000..34c585eb --- /dev/null +++ b/src/uxBlock/prompt.go @@ -0,0 +1,142 @@ +package uxBlock + +import ( + "context" + "errors" + + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" +) + +type promptConfig struct { + label string + header *TableRow +} + +type PromptOption = func(cfg *promptConfig) + +func (b *UxBlocks) Prompt( + ctx context.Context, + message string, + choices []string, + auxOptions ...PromptOption, +) (int, error) { + cfg := promptConfig{} + for _, opt := range auxOptions { + opt(&cfg) + } + + // FIXME - janhajek fix message + if !b.isTerminal { + return 0, errors.New(cfg.label + ", you can choose only in terminal") + } + + model := &promptModel{ + cfg: cfg, + uxBlocks: b, + message: message, + choices: choices, + } + p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) + _, err := p.Run() + if err != nil { + return 0, err + } + + if model.canceled { + b.ctxCancel() + return 0, context.Canceled + } + + return model.cursor, nil +} + +type promptModel struct { + cfg promptConfig + uxBlocks *UxBlocks + message string + choices []string + cursor int + quiting bool + canceled bool +} + +func (m *promptModel) Init() tea.Cmd { + return nil +} + +func (m *promptModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + if msg, ok := msg.(tea.KeyMsg); ok { + switch msg.String() { + + case "ctrl+c": + m.canceled = true + return m, tea.Quit + + case "left": + if m.cursor > 0 { + m.cursor-- + } + + case "right": + if m.cursor < len(m.choices)-1 { + m.cursor++ + } + case "enter": + m.quiting = true + + return m, tea.Quit + } + } + + return m, nil +} + +func (m *promptModel) View() string { + if m.quiting { + return "" + } + + buttonsTexts := []string{} + for i, choice := range m.choices { + if i == m.cursor { + buttonsTexts = append(buttonsTexts, activeButtonStyle.Render(choice)) + } else { + buttonsTexts = append(buttonsTexts, buttonStyle.Render(choice)) + } + } + + question := lipgloss.NewStyle().Width(50).Align(lipgloss.Center).Render(m.message) + buttons := lipgloss.JoinHorizontal(lipgloss.Top, buttonsTexts...) + ui := lipgloss.JoinVertical(lipgloss.Center, question, buttons) + + dialog := lipgloss.Place(0, 0, + lipgloss.Left, lipgloss.Center, + dialogBoxStyle.Render(ui), + ) + + return dialog +} + +var ( + dialogBoxStyle = lipgloss.NewStyle(). + Border(lipgloss.RoundedBorder()). + BorderForeground(lipgloss.Color("#874BFD")). + Padding(1, 0). + BorderTop(true). + BorderLeft(true). + BorderRight(true). + BorderBottom(true) + + buttonStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#FFF7DB")). + Background(lipgloss.Color("#888B7E")). + Padding(0, 3). + MarginRight(2). + MarginTop(1) + + activeButtonStyle = buttonStyle.Copy(). + Foreground(lipgloss.Color("#FFF7DB")). + Background(lipgloss.Color("#F25D94")). + Underline(true) +) diff --git a/src/uxBlock/select.go b/src/uxBlock/select.go new file mode 100644 index 00000000..3f63c032 --- /dev/null +++ b/src/uxBlock/select.go @@ -0,0 +1,191 @@ +package uxBlock + +import ( + "context" + "errors" + "slices" + "strings" + + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/table" +) + +type selectConfig struct { + label string + multiSelect bool + header *TableRow +} + +func SelectLabel(label string) SelectOption { + return func(cfg *selectConfig) { + cfg.label = label + } +} + +func SelectEnableMultiSelect() SelectOption { + return func(cfg *selectConfig) { + cfg.multiSelect = true + } +} + +func SelectTableHeader(header *TableRow) SelectOption { + return func(cfg *selectConfig) { + cfg.header = header + } +} + +type SelectOption = func(cfg *selectConfig) + +func (b *UxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions ...SelectOption) ([]int, error) { + cfg := selectConfig{} + for _, opt := range auxOptions { + opt(&cfg) + } + + // FIXME - janhajek fix message + if !b.isTerminal { + return nil, errors.New(cfg.label + ", you can choose only in terminal") + } + + model := &selectModel{ + cfg: cfg, + uxBlocks: b, + tableBody: tableBody, + selected: make(map[int]struct{}), + } + p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) + _, err := p.Run() + if err != nil { + return nil, err + } + + if model.canceled { + b.ctxCancel() + return nil, context.Canceled + } + + sortedSelection := make([]int, 0, len(model.selected)) + for value := range model.selected { + sortedSelection = append(sortedSelection, value) + } + slices.Sort(sortedSelection) + + return sortedSelection, nil +} + +type selectModel struct { + cfg selectConfig + uxBlocks *UxBlocks + tableBody *TableBody + cursor int + selected map[int]struct{} + quiting bool + canceled bool +} + +func (m *selectModel) Init() tea.Cmd { + return nil +} + +func (m *selectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + // Make sure these keys always quiting + if msg, ok := msg.(tea.KeyMsg); ok { + switch msg.String() { + + case "ctrl+c": + m.canceled = true + return m, tea.Quit + + case "up": + if m.cursor > 0 { + m.cursor-- + } + + case "down": + if m.cursor < len(m.tableBody.rows)-1 { + m.cursor++ + } + case "enter": + m.quiting = true + + if !m.cfg.multiSelect { + m.selected = make(map[int]struct{}) + m.selected[m.cursor] = struct{}{} + } + + return m, tea.Quit + } + + if m.cfg.multiSelect { + switch msg.String() { + + case " ": + if _, ok := m.selected[m.cursor]; ok { + delete(m.selected, m.cursor) + } else { + m.selected[m.cursor] = struct{}{} + } + } + } + } + + return m, nil +} + +func (m *selectModel) View() string { + if m.quiting { + return "" + } + + baseStyle := lipgloss.NewStyle().Padding(0, 1) + + t := table.New(). + Border(lipgloss.NormalBorder()). + BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("238"))). + StyleFunc(func(row, col int) lipgloss.Style { + even := row%2 == 0 + + if even { + return baseStyle.Copy().Foreground(lipgloss.Color("245")) + } + return baseStyle.Copy().Foreground(lipgloss.Color("252")) + }) + + if m.cfg.header != nil { + capitalizeHeaders := func(data []string) []string { + for i := range data { + data[i] = strings.ToUpper(data[i]) + } + return data + } + + headers := make([]string, len(m.cfg.header.cells)+1) + headers[0] = "" + for i, header := range m.cfg.header.cells { + headers[i+1] = header.Text + } + t = t.Headers(capitalizeHeaders(headers)...) + } + + rows := make([][]string, len(m.tableBody.rows)) + for rowIndex, row := range m.tableBody.rows { + cells := make([]string, len(row.cells)+1) + cells[0] = " " + if rowIndex == m.cursor { + cells[0] = "✓" + } + for i, cell := range row.cells { + cells[i+1] = cell.Text + } + rows[rowIndex] = cells + } + t = t.Rows(rows...) + + s := "" + if m.cfg.label != "" { + s = SelectionIcon + m.cfg.label + "\n" + } + + return s + t.String() +} diff --git a/src/uxBlock/showcase/main.go b/src/uxBlock/showcase/main.go new file mode 100644 index 00000000..6d5405d2 --- /dev/null +++ b/src/uxBlock/showcase/main.go @@ -0,0 +1,162 @@ +package main + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + "time" + + "github.com/mattn/go-isatty" + "github.com/zeropsio/zcli/src/logger" + . "github.com/zeropsio/zcli/src/uxBlock" +) + +func main() { + ctx, cancel := context.WithCancel(context.Background()) + regSignals(cancel) + + blocks, err := createBlocks(cancel) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + err = do(ctx, blocks) + if err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func do(ctx context.Context, blocks *UxBlocks) error { + prompts(ctx, blocks) + spinners(ctx, blocks) + texts(ctx, blocks) + tables(ctx, blocks) + + return nil +} + +func spinners(ctx context.Context, blocks *UxBlocks) { + { + fmt.Println("========= spinners block =========") + + spinner1 := NewSpinner(InfoText("Running 1").String()) + spinner2 := NewSpinner(InfoText("Running 2").String()) + spinner3 := NewSpinner(InfoText("Running 3").String()) + + stop := blocks.RunSpinners(ctx, []*Spinner{spinner1, spinner2, spinner3}) + + counter := 0 + tick := time.NewTicker(time.Second * 1) + defer tick.Stop() + for { + select { + case <-ctx.Done(): + return + case <-tick.C: + counter++ + if counter == 2 { + spinner2.Finish(NewLine(SuccessIcon, SuccessText("Finished successfully")).String()) + } + if counter == 4 { + spinner1.Finish(NewLine(ErrorIcon, ErrorText("finished with error")).String()) + } + if counter == 6 { + spinner3.Finish(NewLine(WarningIcon, WarningText("Finish with warning")).String()) + } + } + if counter == 6 { + break + } + } + + stop() + + fmt.Println("========= spinners block end =========") + } +} + +func prompts(ctx context.Context, blocks *UxBlocks) { + fmt.Println("========= prompt block =========") + choices := []string{"yes", "no", "maybe"} + choice, err := blocks.Prompt(ctx, "Question?", choices) + if err != nil { + return + } + + blocks.PrintInfoLine("selected", choices[choice]) + + fmt.Println("========= prompt block end =========") +} + +func texts(ctx context.Context, blocks *UxBlocks) { + fmt.Println("========= texts block =========") + blocks.PrintInfoLine("info line") + blocks.PrintWarningLine("warning line") + blocks.PrintErrorLine("Error line") + blocks.PrintLine(WarningText("Line"), " with ", InfoIcon, InfoText("mixed"), " ", ErrorText("styles")) + fmt.Println("========= texts block end =========") +} + +func tables(ctx context.Context, blocks *UxBlocks) { + fmt.Println("========= table selection block =========") + + tableData := [][]string{ + {"lorem", "ipsum", "dolor", "sit"}, + {"amet", "consectetur", "adipiscing", "elit"}, + {"sed", "do", "eiusmod", "tempor"}, + {"incididunt", "ut", "labore", "et"}, + } + + body := NewTableBody().AddStringsRows(tableData...) + + line, err := blocks.Select( + ctx, + body, + SelectTableHeader(NewTableRow().AddStringCells("header1", "header2", "header3", "header4")), + SelectLabel("Select line"), + ) + if err != nil { + return + } + + blocks.PrintInfoLine("selected", tableData[line[0]][0]) + + fmt.Println("========= table selection end =========") + fmt.Println("========= print table block =========") + + blocks.PrintInfoLine("printing table") + blocks.Table(body, WithTableHeader(NewTableRow().AddStringCells("header1", "header2", "header3", "header4"))) + + fmt.Println("========= print table block end =========") +} + +func regSignals(contextCancel func()) { + sigs := make(chan os.Signal, 1) + + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + contextCancel() + }() +} + +func createBlocks(contextCancelFunc func()) (*UxBlocks, error) { + isTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) + + outputLogger := logger.NewOutputLogger(logger.OutputConfig{ + IsTerminal: isTerminal, + }) + + debugFileLogger := logger.NewDebugFileLogger(logger.DebugFileConfig{ + FilePath: "zerops.log", + }) + + blocks := NewBlock(outputLogger, debugFileLogger, isTerminal, contextCancelFunc, []string{}) + + return blocks, nil +} diff --git a/src/uxBlock/showcase/zerops.log b/src/uxBlock/showcase/zerops.log new file mode 100755 index 00000000..f539dad8 --- /dev/null +++ b/src/uxBlock/showcase/zerops.log @@ -0,0 +1,54 @@ +time="2023-12-15T15:17:38+01:00" level=info msg="Normal line" +time="2023-12-15T15:17:38+01:00" level=info msg="✅ Success line" +time="2023-12-15T15:17:38+01:00" level=info msg="⚠️ Warning line" +time="2023-12-15T15:17:38+01:00" level=info msg="❌ Error line" +time="2023-12-15T15:17:38+01:00" level=info msg="ℹ️ Info line" +time="2023-12-15T15:17:38+01:00" level=info msg="ℹ️ xx" +time="2023-12-15T15:17:38+01:00" level=info msg="errortextInfo linesuccesstext" +time="2023-12-15T15:19:24+01:00" level=info msg="Normal line" +time="2023-12-15T15:19:24+01:00" level=info msg="✅ Success line" +time="2023-12-15T15:19:24+01:00" level=info msg="⚠️ Warning line" +time="2023-12-15T15:19:24+01:00" level=info msg="❌ Error line" +time="2023-12-15T15:19:24+01:00" level=info msg="ℹ️ Info line" +time="2023-12-15T15:19:24+01:00" level=info msg="errortextInfo linesuccesstext" +time="2023-12-15T15:19:45+01:00" level=info msg="Normal line" +time="2023-12-15T15:19:45+01:00" level=info msg="✅ Success line" +time="2023-12-15T15:19:45+01:00" level=info msg="⚠️ Warning line" +time="2023-12-15T15:19:45+01:00" level=info msg="❌ Error line" +time="2023-12-15T15:19:45+01:00" level=info msg="ℹ️ Info line" +time="2023-12-15T15:19:45+01:00" level=info msg="errortextInfo linesuccesstext" +time="2023-12-15T19:56:12+01:00" level=info msg="Normal line" +time="2023-12-15T19:56:12+01:00" level=info msg="✅ Success line" +time="2023-12-15T19:56:12+01:00" level=info msg="⚠️ Warning line" +time="2023-12-15T19:56:12+01:00" level=error msg="❌ Error line" +time="2023-12-15T19:56:12+01:00" level=info msg="ℹ️ Info line" +time="2023-12-15T19:56:12+01:00" level=info msg="errortextInfo linesuccesstext" +time="2023-12-15T19:56:58+01:00" level=info msg="[Done]" +time="2023-12-15T19:58:52+01:00" level=info msg=Done +time="2023-12-15T20:44:41+01:00" level=info msg="\x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:44:47+01:00" level=info msg="\x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:45:24+01:00" level=info msg="✅ \x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:45:53+01:00" level=info msg="✅ \x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:45:57+01:00" level=info msg="✅ \x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:56:12+01:00" level=info msg="Normal line" +time="2023-12-15T20:56:12+01:00" level=info msg="✅ Success line" +time="2023-12-15T20:56:12+01:00" level=warning msg="⚠️ Warning line" +time="2023-12-15T20:56:12+01:00" level=error msg="❌ Error line" +time="2023-12-15T20:56:12+01:00" level=info msg="ℹ️ Info line" +time="2023-12-15T20:56:12+01:00" level=info msg="errortextInfo linesuccesstext" +time="2023-12-15T20:56:16+01:00" level=info msg="❔ selected: lorem" +time="2023-12-15T20:56:16+01:00" level=info msg="printing table" +time="2023-12-15T20:56:18+01:00" level=info msg="✅ \x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:56:20+01:00" level=info msg="✅ Downloading something" +time="2023-12-15T20:58:57+01:00" level=info msg="Normal line" +time="2023-12-15T20:58:57+01:00" level=info msg="✅ Success line" +time="2023-12-15T20:58:57+01:00" level=warning msg="⚠️ Warning line" +time="2023-12-15T20:58:57+01:00" level=error msg="❌ Error line" +time="2023-12-15T20:58:57+01:00" level=info msg="ℹ️ Info line" +time="2023-12-15T20:58:57+01:00" level=info msg="errortextInfo linesuccesstext" +time="2023-12-15T20:59:01+01:00" level=info msg="❔ selected: lorem" +time="2023-12-15T20:59:01+01:00" level=info msg="printing table" +time="2023-12-15T20:59:03+01:00" level=info msg="✅ \x1b[38;5;47mFinished \x1b[0msome action name" +time="2023-12-15T20:59:05+01:00" level=info msg="✅ Downloading something" +time="2023-12-16T21:21:30+01:00" level=info msg="✅ Downloading something" +time="2023-12-16T21:21:35+01:00" level=info msg="✅ Downloading something" diff --git a/src/uxBlock/spinner.go b/src/uxBlock/spinner.go new file mode 100644 index 00000000..a2a3372a --- /dev/null +++ b/src/uxBlock/spinner.go @@ -0,0 +1,190 @@ +package uxBlock + +import ( + "context" + "sync" + + bubblesSpinner "github.com/charmbracelet/bubbles/spinner" + tea "github.com/charmbracelet/bubbletea" +) + +func (b *UxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOptions ...SpinnerOption) func() { + cfg := spinnerConfig{} + for _, opt := range auxOptions { + opt(&cfg) + } + + //if !b.isTerminal { + // return func(success bool) { + // // FIXME - janhajek + // //if success { + // // b.info(cfg.successMessage) + // //} else { + // // b.Error(cfg.failureMessage) + // //} + // } + //} + + model := &spinnerModel{ + cfg: cfg, + uxBlocks: b, + spinners: spinners, + } + + p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) + go func() { + p.Run() + if model.canceled { + b.ctxCancel() + } + }() + + return func() { + p.Send(spinnerEndCmd{}) + p.Wait() + // FIXME - janhajek + //if success { + // b.info(cfg.successMessage) + //} else { + // b.Error(cfg.failureMessage) + //} + } +} + +type spinnerEndCmd struct { +} + +type spinnerModel struct { + cfg spinnerConfig + spinners []*Spinner + uxBlocks *UxBlocks + + quiting bool + canceled bool +} + +type MergeMessage []tea.Cmd + +func XXX(cmdList ...tea.Cmd) func() tea.Msg { + return func() tea.Msg { + return MergeMessage(cmdList) + } +} +func (m *spinnerModel) Init() tea.Cmd { + ticks := make([]tea.Cmd, len(m.spinners)) + for i := range m.spinners { + ticks[i] = m.spinners[i].init() + } + + return XXX(ticks...) +} + +func (m *spinnerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case spinnerEndCmd: + m.quiting = true + return m, tea.Quit + + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c": + + m.canceled = true + m.quiting = true + return m, tea.Quit + } + + case MergeMessage: + cmdList := make([]tea.Cmd, len(msg)) + + var lock sync.Mutex + + wg := sync.WaitGroup{} + for i := range msg { + wg.Add(1) + go func(i int) { + defer wg.Done() + + var teaMsg tea.Msg + if msg[i] != nil { + teaMsg = msg[i]() + } + + cmd := m.spinners[i].update(teaMsg) + + lock.Lock() + cmdList[i] = cmd + lock.Unlock() + + }(i) + } + wg.Wait() + return m, XXX(cmdList...) + + } + + return m, nil +} + +func (m *spinnerModel) View() string { + var s string + for _, spinner := range m.spinners { + if m.canceled { + s += "canceled\n" + } else { + s += spinner.view() + spinner.text + "\n" + } + } + + return s +} + +type spinnerConfig struct { +} + +type SpinnerOption = func(cfg *spinnerConfig) + +type Spinner struct { + text string + finished bool + spinner bubblesSpinner.Model +} + +func NewSpinner(text string) *Spinner { + return &Spinner{ + text: text, + spinner: bubblesSpinner.New(bubblesSpinner.WithSpinner(bubblesSpinner.MiniDot)), + } +} + +func (s *Spinner) SetMessage(text string) *Spinner { + s.text = text + + return s +} + +func (s *Spinner) Finish(text string) *Spinner { + s.text = text + s.finished = true + + return s +} + +func (s *Spinner) init() func() tea.Msg { + return s.spinner.Tick +} + +func (s *Spinner) update(msg tea.Msg) (cmd tea.Cmd) { + if !s.finished { + s.spinner, cmd = s.spinner.Update(msg) + } + return +} + +func (s *Spinner) view() string { + if !s.finished { + return s.spinner.View() + " " + } + + return "" +} diff --git a/src/uxBlock/styles.go b/src/uxBlock/styles.go new file mode 100644 index 00000000..046f4645 --- /dev/null +++ b/src/uxBlock/styles.go @@ -0,0 +1,108 @@ +package uxBlock + +import ( + "fmt" + "os" + + "github.com/charmbracelet/lipgloss" +) + +const ( + SuccessIcon = "✅ " + ErrorIcon = "❌ " + SelectionIcon = "❔ " + InfoIcon = "ℹ️" + WarningIcon = "⚠️" +) + +var defaultStyle = lipgloss.NewStyle(). + Renderer(lipgloss.NewRenderer(os.Stdout)) + +var successColor = defaultStyle. + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#00ff5f", ANSI256: "47", ANSI: "0"}, + Dark: lipgloss.CompleteColor{TrueColor: "#00ff5f", ANSI256: "47", ANSI: "0"}, + }). + Bold(false) + +var errorColor = defaultStyle. + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#FF000", ANSI256: "196", ANSI: "0"}, + Dark: lipgloss.CompleteColor{TrueColor: "#FF000", ANSI256: "196", ANSI: "0"}, + }). + Bold(true) + +var warningColor = defaultStyle. + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#ffff87", ANSI256: "228", ANSI: "0"}, + Dark: lipgloss.CompleteColor{TrueColor: "#ffff87", ANSI256: "228", ANSI: "0"}, + }). + Bold(true) + +var infoColor = defaultStyle. + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#00afff", ANSI256: "039", ANSI: "0"}, + Dark: lipgloss.CompleteColor{TrueColor: "#00afff", ANSI256: "039", ANSI: "0"}, + }). + Bold(true) + +func ErrorText(text string) lipgloss.Style { + return errorColor.Copy().SetString(text) +} + +func SuccessText(text string) lipgloss.Style { + return successColor.Copy().SetString(text) +} + +func WarningText(text string) lipgloss.Style { + return warningColor.Copy().SetString(text) +} + +func InfoText(text string) lipgloss.Style { + return infoColor.Copy().SetString(text) +} + +type line struct { + args []interface{} + styles bool +} + +func NewLine(args ...interface{}) line { + return line{ + args: args, + styles: true, + } +} + +func (l line) DisableStyle() line { + l.styles = false + return l +} + +func (l line) Merge(lines ...line) line { + for _, line := range lines { + l.args = append(l.args, line.args...) + } + return l +} + +func (l line) NotEmpty() bool { + return len(l.args) > 0 +} + +func (l line) String() string { + if l.styles { + return fmt.Sprint(l.args...) + } + return fmt.Sprint(removeStyles(l.args)...) +} + +func removeStyles(args []interface{}) []interface{} { + for i, arg := range args { + if typed, ok := arg.(lipgloss.Style); ok { + args[i] = typed.Value() + } + } + + return args +} diff --git a/src/uxBlock/table.go b/src/uxBlock/table.go new file mode 100644 index 00000000..a7102013 --- /dev/null +++ b/src/uxBlock/table.go @@ -0,0 +1,138 @@ +package uxBlock + +import ( + "fmt" + "strings" + + "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/table" +) + +type tableConfig struct { + header *TableRow +} + +type TableBody struct { + rows []*TableRow +} + +func NewTableBody() *TableBody { + return &TableBody{} +} + +func (b *TableBody) AddRow(row *TableRow) { + b.rows = append(b.rows, row) +} + +func (b *TableBody) AddStringsRows(rows ...[]string) *TableBody { + for _, row := range rows { + b.AddStringsRow(row...) + } + + return b +} + +func (b *TableBody) AddStringsRow(cells ...string) *TableBody { + b.AddRow(NewTableRow().AddStringCells(cells...)) + + return b +} + +type TableRow struct { + cells []*TableCell +} + +func NewTableRow() *TableRow { + return &TableRow{} +} + +func (r *TableRow) AddCell(cell *TableCell) *TableRow { + r.cells = append(r.cells, cell) + + return r +} + +func (r *TableRow) AddStringCells(cells ...string) *TableRow { + for _, cell := range cells { + r.AddStringCell(cell) + } + + return r +} + +func (r *TableRow) AddStringCell(text string) *TableRow { + r.cells = append(r.cells, NewTableCell(text)) + + return r +} + +type TableCell struct { + Text string +} + +func NewTableCell(text string) *TableCell { + return &TableCell{Text: text} +} + +func WithTableHeader(header *TableRow) TableOption { + return func(cfg *tableConfig) { + cfg.header = header + } +} + +type TableOption = func(cfg *tableConfig) + +func (b *UxBlocks) Table(body *TableBody, auxOptions ...TableOption) { + cfg := tableConfig{} + for _, opt := range auxOptions { + opt(&cfg) + } + + baseStyle := lipgloss.NewStyle().Padding(0, 1) + headerStyle := baseStyle.Copy().Foreground(lipgloss.Color("252")).Bold(true) + + baseStyle.SetString() + + t := table.New(). + Border(lipgloss.NormalBorder()). + BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("238"))). + StyleFunc(func(row, col int) lipgloss.Style { + if row == 0 && cfg.header != nil { + return headerStyle + } + + even := row%2 == 0 + + if even { + return baseStyle.Copy().Foreground(lipgloss.Color("245")) + } + return baseStyle.Copy().Foreground(lipgloss.Color("252")) + }) + + if cfg.header != nil { + capitalizeHeaders := func(data []string) []string { + for i := range data { + data[i] = strings.ToUpper(data[i]) + } + return data + } + + headers := make([]string, len(cfg.header.cells)) + for i, header := range cfg.header.cells { + headers[i] = header.Text + } + t = t.Headers(capitalizeHeaders(headers)...) + } + + rows := make([][]string, len(body.rows)) + for rowIndex, row := range body.rows { + cells := make([]string, len(row.cells)) + for i, cell := range row.cells { + cells[i] = cell.Text + } + rows[rowIndex] = cells + } + t = t.Rows(rows...) + + fmt.Println(t) +} diff --git a/src/uxHelpers/project.go b/src/uxHelpers/project.go new file mode 100644 index 00000000..eddd8003 --- /dev/null +++ b/src/uxHelpers/project.go @@ -0,0 +1,84 @@ +package uxHelpers + +import ( + "context" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" +) + +func PrintProjectSelector( + ctx context.Context, + uxBlocks *uxBlock.UxBlocks, + restApiClient *zeropsRestApiClient.Handler, +) (*entity.Project, error) { + projects, err := repository.GetAllProjects(ctx, restApiClient) + if err != nil { + return nil, err + } + + if len(projects) == 0 { + uxBlocks.PrintWarningLine(i18n.T(i18n.ProjectSelectorListEmpty)) + return nil, nil + } + + header, tableBody := createProjectTableRows(projects) + + projectIndex, err := uxBlocks.Select( + ctx, + tableBody, + uxBlock.SelectLabel(i18n.T(i18n.ProjectSelectorPrompt)), + uxBlock.SelectTableHeader(header), + ) + if err != nil { + return nil, err + } + + if len(projectIndex) == 0 { + return nil, errors.New(i18n.T(i18n.ProjectSelectorOutOfRangeError)) + } + + if projectIndex[0] > len(projects)-1 { + return nil, errors.New(i18n.T(i18n.ProjectSelectorOutOfRangeError)) + } + + return &projects[projectIndex[0]], nil +} + +func PrintProjectList( + ctx context.Context, + uxBlocks *uxBlock.UxBlocks, + restApiClient *zeropsRestApiClient.Handler) error { + projects, err := repository.GetAllProjects(ctx, restApiClient) + if err != nil { + return err + } + + header, rows := createProjectTableRows(projects) + + uxBlocks.Table(rows, uxBlock.WithTableHeader(header)) + + return nil +} + +func createProjectTableRows(projects []entity.Project) (*uxBlock.TableRow, *uxBlock.TableBody) { + // FIXME - janhajek translation + header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Description", "Client ID", "Status") + + tableBody := &uxBlock.TableBody{} + for _, project := range projects { + tableBody.AddStringsRow( + string(project.ID), + project.Name.String(), + project.Description.Native(), + project.ClientId.Native(), + project.Status.String(), + ) + } + + return header, tableBody +} diff --git a/src/uxHelpers/service.go b/src/uxHelpers/service.go new file mode 100644 index 00000000..56b8069d --- /dev/null +++ b/src/uxHelpers/service.go @@ -0,0 +1,81 @@ +package uxHelpers + +import ( + "context" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" +) + +func PrintServiceSelector( + ctx context.Context, + uxBlocks *uxBlock.UxBlocks, + restApiClient *zeropsRestApiClient.Handler, + project entity.Project, +) (*entity.Service, error) { + services, err := repository.GetNonSystemServicesByProject(ctx, restApiClient, project) + if err != nil { + return nil, err + } + + if len(services) == 0 { + uxBlocks.PrintWarningLine(i18n.T(i18n.ServiceSelectorListEmpty)) + return nil, nil + } + + header, rows := createServiceTableRows(services) + + serviceIndex, err := uxBlocks.Select( + ctx, + rows, + uxBlock.SelectLabel(i18n.T(i18n.ServiceSelectorPrompt)), + uxBlock.SelectTableHeader(header), + ) + if err != nil { + return nil, err + } + + if len(serviceIndex) == 0 { + return nil, errors.New(i18n.T(i18n.ProjectSelectorOutOfRangeError)) + } + + if serviceIndex[0] > len(services)-1 { + return nil, errors.New(i18n.T(i18n.ProjectSelectorOutOfRangeError)) + } + + return &services[serviceIndex[0]], nil +} + +func PrintServiceList( + ctx context.Context, + uxBlocks *uxBlock.UxBlocks, + restApiClient *zeropsRestApiClient.Handler, + project entity.Project, +) error { + services, err := repository.GetNonSystemServicesByProject(ctx, restApiClient, project) + if err != nil { + return err + } + + header, tableBody := createServiceTableRows(services) + + uxBlocks.Table(tableBody, uxBlock.WithTableHeader(header)) + + return nil +} + +func createServiceTableRows(projects []entity.Service) (*uxBlock.TableRow, *uxBlock.TableBody) { + // FIXME - janhajek translation + header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Status") + + tableBody := &uxBlock.TableBody{} + for _, project := range projects { + tableBody.AddStringsRow(string(project.ID), project.Name.String(), project.Status.String()) + } + + return header, tableBody +} diff --git a/src/uxHelpers/spinner.go b/src/uxHelpers/spinner.go new file mode 100644 index 00000000..3fb0d110 --- /dev/null +++ b/src/uxHelpers/spinner.go @@ -0,0 +1,99 @@ +package uxHelpers + +import ( + "context" + "sync" + "time" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func ProcessCheckWithSpinner( + ctx context.Context, + uxBlocks *uxBlock.UxBlocks, + restApiClient *zeropsRestApiClient.Handler, + processList []Process, +) error { + var spinners []*uxBlock.Spinner + for _, process := range processList { + spinners = append(spinners, uxBlock.NewSpinner(process.RunningMessage)) + } + + stopFunc := uxBlocks.RunSpinners(ctx, spinners) + + var returnErr error + + var once sync.Once + + wg := sync.WaitGroup{} + for i := range processList { + wg.Add(1) + go func(i int) { + defer wg.Done() + process := processList[i] + + err := checkProcess(ctx, process.Id, restApiClient) + if err != nil { + spinners[i].Finish(uxBlock.NewLine(uxBlock.ErrorIcon, uxBlock.ErrorText(process.ErrorMessageMessage)).String()) + stopFunc() + + once.Do(func() { + returnErr = err + }) + return + } + spinners[i].Finish(uxBlock.NewLine(uxBlock.SuccessIcon, uxBlock.SuccessText(process.SuccessMessage)).String()) + }(i) + } + + wg.Wait() + stopFunc() + + return returnErr +} + +type Process struct { + Id uuid.ProcessId + RunningMessage string + ErrorMessageMessage string + SuccessMessage string +} + +func checkProcess(ctx context.Context, processId uuid.ProcessId, restApiClient *zeropsRestApiClient.Handler) error { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return nil + case <-ticker.C: + getProcessResponse, err := restApiClient.GetProcess(ctx, path.ProcessId{Id: processId}) + if err != nil { + return err + } + + processOutput, err := getProcessResponse.Output() + if err != nil { + return err + } + + processStatus := processOutput.Status + + if processStatus == enum.ProcessStatusEnumFinished { + return nil + } + + if !(processStatus == enum.ProcessStatusEnumRunning || + processStatus == enum.ProcessStatusEnumPending) { + return errors.Errorf(i18n.T(i18n.ProcessInvalidState), processId) + } + } + } +} diff --git a/src/vpn/cleanVpn_darwin.go b/src/vpn/cleanVpn_darwin.go deleted file mode 100644 index cdbb4d34..00000000 --- a/src/vpn/cleanVpn_darwin.go +++ /dev/null @@ -1,31 +0,0 @@ -//go:build darwin - -package vpn - -import ( - "context" - "errors" - "net" - "os" - "path" - - "github.com/zeropsio/zcli/src/i18n" -) - -func (h *Handler) cleanVpn(_ context.Context, interfaceName string) error { - interfaces, err := net.Interfaces() - if err != nil { - h.logger.Error(err) - return errors.New(i18n.VpnStopUnableToRemoveTunnelInterface) - } - for _, in := range interfaces { - if in.Name == interfaceName { - socket := path.Join("/var/run/wireguard/", interfaceName+".sock") - h.logger.Debugf("remove wireguard socket: %s", socket) - if err := os.Remove(socket); err != nil { - return errors.New(i18n.VpnStopUnableToRemoveTunnelInterface) - } - } - } - return nil -} diff --git a/src/vpn/cleanVpn_linux.go b/src/vpn/cleanVpn_linux.go deleted file mode 100644 index 5cd9d617..00000000 --- a/src/vpn/cleanVpn_linux.go +++ /dev/null @@ -1,30 +0,0 @@ -//go:build linux - -package vpn - -import ( - "context" - "net" - - "github.com/zeropsio/zcli/src/i18n" -) - -func (h *Handler) cleanVpn(ctx context.Context, interfaceName string) error { - interfaces, err := net.Interfaces() - if err != nil { - return err - } - for _, in := range interfaces { - if in.Name == interfaceName { - return h.runCommands( - ctx, - makeCommand( - "ip", - commandWithErrorMessage(i18n.VpnStopUnableToRemoveTunnelInterface), - commandWithArgs("link", "del", interfaceName), - ), - ) - } - } - return nil -} diff --git a/src/vpn/cleanVpn_windows.go b/src/vpn/cleanVpn_windows.go deleted file mode 100644 index 84674392..00000000 --- a/src/vpn/cleanVpn_windows.go +++ /dev/null @@ -1,39 +0,0 @@ -//go:build windows - -package vpn - -import ( - "context" - "errors" - "os" - - "github.com/zeropsio/zcli/src/i18n" - "golang.zx2c4.com/wireguard/wgctrl" -) - -func (h *Handler) cleanVpn(ctx context.Context, interfaceName string) error { - - wg, err := wgctrl.New() - if err != nil { - h.logger.Error(err) - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wg.Close() - - h.logger.Debug("check interface: ", interfaceName) - if _, err := wg.Device(interfaceName); err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - - return h.runCommands( - ctx, - makeCommand( - "wireguard", - commandWithErrorMessage(i18n.VpnStopUnableToRemoveTunnelInterface), - commandWithArgs("/uninstalltunnelservice", interfaceName), - ), - ) -} diff --git a/src/vpn/commands.go b/src/vpn/commands.go deleted file mode 100644 index 42eafc9b..00000000 --- a/src/vpn/commands.go +++ /dev/null @@ -1,76 +0,0 @@ -package vpn - -import ( - "context" - "errors" - "os/exec" - "strings" -) - -type command struct { - command string - args []string - stdin string - errorMessage string -} - -func commandWithArgs(args ...string) func(*command) { - return func(c *command) { - c.args = append(c.args, args...) - } -} -func commandWithErrorMessage(errorMessage string) func(*command) { - return func(c *command) { - c.errorMessage = errorMessage - } -} - -func commandWithStdin(stdin string) func(*command) { - return func(c *command) { - c.stdin = stdin - } -} - -func makeCommand(cmd string, options ...func(*command)) command { - c := &command{ - command: cmd, - } - for _, o := range options { - o(c) - } - return *c -} - -func (h *Handler) runCommands( - ctx context.Context, - commands ...command, -) error { - for _, cmd := range commands { - _, err := h.runCommand(ctx, cmd) - if err != nil { - return err - } - } - return nil -} - -func (h *Handler) runCommand( - ctx context.Context, - cmd command, -) ([]byte, error) { - c := exec.CommandContext(ctx, cmd.command, cmd.args...) - if cmd.stdin != "" { - c.Stdin = strings.NewReader(cmd.stdin) - } - output, err := c.Output() - if err != nil { - h.logger.Debug(cmd.command, cmd.args) - h.logger.Debug(string(output)) - h.logger.Error(err) - return nil, errors.New(cmd.errorMessage) - } else { - h.logger.Debug(cmd.command, cmd.args) - h.logger.Debug(string(output)) - } - return output, err -} diff --git a/src/vpn/dnsClean.go b/src/vpn/dnsClean.go deleted file mode 100644 index 3b05d682..00000000 --- a/src/vpn/dnsClean.go +++ /dev/null @@ -1,44 +0,0 @@ -package vpn - -import ( - "context" - "os/exec" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/utils" - "github.com/zeropsio/zcli/src/utils/cmdRunner" -) - -func (h *Handler) DnsClean(ctx context.Context) error { - - data := h.storage.Data() - - switch data.DnsManagement { - case daemonStorage.LocalDnsManagementUnknown: - return nil - case daemonStorage.LocalDnsManagementSystemdResolve: - return nil - case daemonStorage.LocalDnsManagementResolveConf: - cmd := exec.Command("resolvconf", "-d", data.InterfaceName) - _, err := cmdRunner.Run(cmd) - if err != nil { - return err - } - case daemonStorage.LocalDnsManagementFile: - err := utils.RemoveFirstLine(constants.ResolvFilePath, "nameserver "+data.DnsIp.String()) - if err != nil { - return err - } - case daemonStorage.LocalDnsManagementNetworkSetup: - if err := h.dnsCleanNetworkSetup(ctx); err != nil { - return err - } - - case daemonStorage.LocalDnsManagementWindows: - return nil - default: - return nil - } - return nil -} diff --git a/src/vpn/dnsCleanNetworkSetup.go b/src/vpn/dnsCleanNetworkSetup.go deleted file mode 100644 index c66c553e..00000000 --- a/src/vpn/dnsCleanNetworkSetup.go +++ /dev/null @@ -1,21 +0,0 @@ -package vpn - -import ( - "context" - "fmt" - "os" -) - -func (h *Handler) dnsCleanNetworkSetup(ctx context.Context) error { - - os.Remove("/etc/resolver/zerops") - - stdin := fmt.Sprintf(`remove State:/Network/Service/zerops_vpn_service/IPv6 -remove Setup:/Network/Service/zerops_vpn_service/IPv6`) - - if _, err := h.runCommand(ctx, makeCommand("scutil", commandWithStdin(stdin))); err != nil { - return err - } - - return nil -} diff --git a/src/vpn/dnsDetect.go b/src/vpn/dnsDetect.go deleted file mode 100644 index 151c2135..00000000 --- a/src/vpn/dnsDetect.go +++ /dev/null @@ -1,9 +0,0 @@ -package vpn - -import ( - "github.com/zeropsio/zcli/src/daemonStorage" -) - -func DnsDetect() (daemonStorage.LocalDnsManagement, error) { - return dnsDetect() -} diff --git a/src/vpn/dnsDetect_darwin.go b/src/vpn/dnsDetect_darwin.go deleted file mode 100644 index d9fb8e57..00000000 --- a/src/vpn/dnsDetect_darwin.go +++ /dev/null @@ -1,17 +0,0 @@ -//go:build darwin - -package vpn - -import ( - "os/exec" - - "github.com/zeropsio/zcli/src/daemonStorage" -) - -func dnsDetect() (daemonStorage.LocalDnsManagement, error) { - if _, err := exec.LookPath("scutil"); err == nil { - return daemonStorage.LocalDnsManagementNetworkSetup, nil - } - return daemonStorage.LocalDnsManagementUnknown, nil - -} diff --git a/src/vpn/dnsDetect_linux.go b/src/vpn/dnsDetect_linux.go deleted file mode 100644 index 935a3da6..00000000 --- a/src/vpn/dnsDetect_linux.go +++ /dev/null @@ -1,88 +0,0 @@ -//go:build linux - -package vpn - -import ( - "os/exec" - "regexp" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/utils" - "github.com/zeropsio/zcli/src/utils/cmdRunner" -) - -func dnsDetect() (daemonStorage.LocalDnsManagement, error) { - - resolvExists, err := utils.FileExists(constants.ResolvFilePath) - if err != nil { - return "", err - } - - if resolvExists { - ok, err := isSystemdResolve() - if err != nil { - return "", err - } - if ok { - return daemonStorage.LocalDnsManagementSystemdResolve, nil - } - } - - _, err = exec.LookPath("resolvconf") - if err == nil { - return daemonStorage.LocalDnsManagementResolveConf, nil - } - - if resolvExists { - return daemonStorage.LocalDnsManagementFile, nil - } - - return daemonStorage.LocalDnsManagementUnknown, nil -} - -func isValidSystemdResolveResolveConf(filePath string) (bool, error) { - lines, err := utils.ReadLines(filePath) - if err != nil { - return false, err - } - - nameserverLine := regexp.MustCompile(`[ ]*nameserver[ ]+(.+)`) - - for _, line := range lines { - submatches := nameserverLine.FindStringSubmatch(line) - if len(submatches) == 2 { - if submatches[1] != "127.0.0.53" { - return false, nil - } else { - return true, nil - } - } - } - - return false, nil -} - -func isSystemdResolve() (bool, error) { - - // resolve.conf is valid for systemd-resolve - validSystemd, err := isValidSystemdResolveResolveConf(constants.ResolvFilePath) - if err != nil { - return false, err - } - if !validSystemd { - return false, nil - } - - // systemd-resolved unit is running - if _, err := cmdRunner.Run(exec.Command("pidof", "systemd-resolved")); err != nil { - return false, nil - } - - // resolvectl binary exists in PATH - if _, err := exec.LookPath("resolvectl"); err != nil { - return false, nil - } - - return true, nil -} diff --git a/src/vpn/dnsDetect_windows.go b/src/vpn/dnsDetect_windows.go deleted file mode 100644 index bb91bbff..00000000 --- a/src/vpn/dnsDetect_windows.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build windows - -package vpn - -import ( - "github.com/zeropsio/zcli/src/daemonStorage" -) - -func dnsDetect() (daemonStorage.LocalDnsManagement, error) { - return daemonStorage.LocalDnsManagementWindows, nil - -} diff --git a/src/vpn/dnsIsAlive.go b/src/vpn/dnsIsAlive.go deleted file mode 100644 index 2f99a79d..00000000 --- a/src/vpn/dnsIsAlive.go +++ /dev/null @@ -1,25 +0,0 @@ -package vpn - -import ( - "context" - "errors" - "time" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/nettools" -) - -func (h *Handler) dnsIsAlive() (bool, error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) - defer cancel() - - if !nettools.HasIPv6PingCommand() { - return false, errors.New(i18n.VpnStatusDnsNoCheckFunction) - } - err := nettools.Ping(ctx, "node1.master.core.zerops") - if err != nil { - h.logger.Error(err) - return false, nil - } - return true, nil -} diff --git a/src/vpn/handler.go b/src/vpn/handler.go deleted file mode 100644 index 4763a8cb..00000000 --- a/src/vpn/handler.go +++ /dev/null @@ -1,36 +0,0 @@ -package vpn - -import ( - "sync" - "time" - - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/utils/logger" -) - -type Config struct { - VpnCheckInterval time.Duration - VpnCheckRetryCount int - VpnCheckTimeout time.Duration -} - -type Handler struct { - config Config - logger logger.Logger - storage *daemonStorage.Handler - - lock sync.RWMutex -} - -func New( - config Config, - logger logger.Logger, - daemonStorage *daemonStorage.Handler, - -) *Handler { - return &Handler{ - config: config, - logger: logger, - storage: daemonStorage, - } -} diff --git a/src/vpn/handler_stopVpn.go b/src/vpn/handler_stopVpn.go deleted file mode 100644 index ff8d9111..00000000 --- a/src/vpn/handler_stopVpn.go +++ /dev/null @@ -1,9 +0,0 @@ -package vpn - -import "context" - -func (h *Handler) StopVpn(ctx context.Context) error { - h.lock.Lock() - defer h.lock.Unlock() - return h.stopVpn(ctx) -} diff --git a/src/vpn/isVpnTunnelAlive.go b/src/vpn/isVpnTunnelAlive.go deleted file mode 100644 index 68ac2e50..00000000 --- a/src/vpn/isVpnTunnelAlive.go +++ /dev/null @@ -1,32 +0,0 @@ -package vpn - -import ( - "context" - "net" - - "github.com/zeropsio/zcli/src/nettools" -) - -func (h *Handler) isVpnTunnelAlive(ctx context.Context, serverIp net.IP) bool { - - if serverIp.String() == "" { - return false - } - - for i := 0; i < h.config.VpnCheckRetryCount; i++ { - if func() bool { - ctx, cancel := context.WithTimeout(ctx, h.config.VpnCheckTimeout) - defer cancel() - - err := nettools.Ping(ctx, serverIp.String()) - if err != nil { - h.logger.Error(err) - return false - } - return true - }() { - return true - } - } - return false -} diff --git a/src/vpn/public_startVpn.go b/src/vpn/public_startVpn.go deleted file mode 100644 index d89a85e4..00000000 --- a/src/vpn/public_startVpn.go +++ /dev/null @@ -1,33 +0,0 @@ -package vpn - -import ( - "context" -) - -func (h *Handler) StartVpn( - ctx context.Context, - grpcApiAddress string, - grpcVpnAddress string, - token string, - projectId string, - userId string, - mtu uint32, - caCertificateUrl string, - preferredPortMin uint32, - preferredPortMax uint32, -) (err error) { - h.lock.Lock() - defer h.lock.Unlock() - return h.startVpn( - ctx, - grpcApiAddress, - grpcVpnAddress, - token, - projectId, - userId, - mtu, - caCertificateUrl, - preferredPortMin, - preferredPortMax, - ) -} diff --git a/src/vpn/public_statusVpn.go b/src/vpn/public_statusVpn.go deleted file mode 100644 index f245e582..00000000 --- a/src/vpn/public_statusVpn.go +++ /dev/null @@ -1,66 +0,0 @@ -package vpn - -import ( - "context" - "errors" - "fmt" - "os" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/daemon" - "golang.zx2c4.com/wireguard/wgctrl" -) - -func (h *Handler) StatusVpn(ctx context.Context) (*daemon.VpnStatus, error) { - data := h.storage.Data() - - vpnStatus := &daemon.VpnStatus{ - TunnelState: daemon.TunnelState_TUNNEL_SET_INACTIVE, - DnsState: daemon.DnsState_DNS_SET_INACTIVE, - } - - if data.InterfaceName == "" { - return vpnStatus, nil - } - - wg, err := wgctrl.New() - if err != nil { - h.logger.Error(err) - return nil, errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wg.Close() - - h.logger.Debug("check interface: ", data.InterfaceName) - if _, err := wg.Device(data.InterfaceName); err != nil { - if os.IsNotExist(err) { - return vpnStatus, h.stopVpn(ctx) - } - return vpnStatus, err - } else { - if !h.isVpnTunnelAlive(ctx, data.ServerIp) { - return vpnStatus, nil - } - } - vpnStatus.TunnelState = daemon.TunnelState_TUNNEL_ACTIVE - - dnsIsAlive, err := h.dnsIsAlive() - if err != nil { - h.logger.Error(err) - vpnStatus.AdditionalInfo = i18n.VpnStatusDnsCheckError + "\n" - } - if dnsIsAlive { - vpnStatus.DnsState = daemon.DnsState_DNS_ACTIVE - } else { - vpnStatus.AdditionalInfo += fmt.Sprintf( - "dns ip: %s\n"+ - "vpn network: %s\n"+ - "client ip: %s\n"+ - "interface: %s\n", - data.DnsIp.String(), - data.VpnNetwork.String(), - data.ClientIp.String(), - data.InterfaceName, - ) - } - return vpnStatus, nil -} diff --git a/src/vpn/reloadVpn.go b/src/vpn/reloadVpn.go deleted file mode 100644 index b514dff3..00000000 --- a/src/vpn/reloadVpn.go +++ /dev/null @@ -1,60 +0,0 @@ -package vpn - -import ( - "context" - "errors" - "os" - "time" - - "github.com/zeropsio/zcli/src/i18n" - "golang.zx2c4.com/wireguard/wgctrl" -) - -func (h *Handler) ReloadVpn( - ctx context.Context, -) (err error) { - - data := h.storage.Data() - - if data.InterfaceName == "" { - return nil - } - - wg, err := wgctrl.New() - if err != nil { - h.logger.Error(err) - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wg.Close() - - h.logger.Debugf("check vpn interface %s", data.InterfaceName) - if _, err := wg.Device(data.InterfaceName); err != nil { - if os.IsNotExist(err) { - h.logger.Debugf("interface %s not exists, starting vpn", data.InterfaceName) - if err := h.DnsClean(ctx); err != nil { - return err - } - time.Sleep(time.Second * 3) - return h.startVpn( - ctx, - data.GrpcApiAddress, - data.GrpcVpnAddress, - data.Token, - data.ProjectId, - data.UserId, - data.Mtu, - data.CaCertificateUrl, - data.PreferredPortMin, - data.PreferredPortMax, - ) - } - return err - } - if err := h.DnsClean(ctx); err != nil { - return err - } - if err := h.setDns(ctx); err != nil { - return err - } - return nil -} diff --git a/src/vpn/setDns.go b/src/vpn/setDns.go deleted file mode 100644 index 8ff63ea2..00000000 --- a/src/vpn/setDns.go +++ /dev/null @@ -1,62 +0,0 @@ -package vpn - -import ( - "context" - "errors" - "os/exec" - "strings" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/utils" - "github.com/zeropsio/zcli/src/utils/cmdRunner" -) - -var UnknownDnsManagementErr = errors.New("unknown dns management") - -func (h *Handler) setDns(ctx context.Context) error { - data := h.storage.Data() - - switch data.DnsManagement { - case daemonStorage.LocalDnsManagementUnknown, daemonStorage.LocalDnsManagementWindows: - return nil - - case daemonStorage.LocalDnsManagementSystemdResolve: - // resolvectl is multi-binary and behaves differently - // based on first command argument it receives (name of the command) - // systemd-resolve is only a symlink to resolvectl - cmd := exec.Command("resolvectl", "--set-dns="+data.DnsIp.String(), `--set-domain=zerops`, "--interface="+data.InterfaceName) - cmd.Args[0] = "systemd-resolve" - if _, err := cmdRunner.Run(cmd); err != nil { - return err - } - - case daemonStorage.LocalDnsManagementResolveConf: - err := utils.SetFirstLine(constants.ResolvconfOrderFilePath, "wg*") - if err != nil { - return err - } - - cmd := exec.Command("resolvconf", "-a", data.InterfaceName) - cmd.Stdin = strings.NewReader(strings.Join([]string{"nameserver " + data.DnsIp.String(), "search zerops"}, "\n")) - if _, err = cmdRunner.Run(cmd); err != nil { - return err - } - - case daemonStorage.LocalDnsManagementFile: - if err := utils.SetFirstLine(constants.ResolvFilePath, "nameserver "+data.DnsIp.String()); err != nil { - return err - } - - case daemonStorage.LocalDnsManagementNetworkSetup: - - if err := h.setDnsNetworksetup(ctx); err != nil { - return err - } - - default: - return UnknownDnsManagementErr - } - - return nil -} diff --git a/src/vpn/setDnsNetworksetup.go b/src/vpn/setDnsNetworksetup.go deleted file mode 100644 index beac8c33..00000000 --- a/src/vpn/setDnsNetworksetup.go +++ /dev/null @@ -1,40 +0,0 @@ -package vpn - -import ( - "context" - "fmt" - "os" -) - -func (h *Handler) setDnsNetworksetup(ctx context.Context) error { - - if err := os.MkdirAll("/etc/resolver", 0755); err != nil { - return err - } - - data := h.storage.Data() - if err := os.WriteFile( - "/etc/resolver/zerops", - []byte( - fmt.Sprintf("nameserver %s\nsearch zerops\n", data.DnsIp.String()), - ), - 0644, - ); err != nil { - return err - } - - stdin := fmt.Sprintf(`d.init -d.add Addresses * fe80::1d04:6b6d:7ad7:85e4 2600:3c03::de:d002 -d.add DestAddresses * ::ffff:ffff:ffff:ffff:0:0 :: -d.add Flags * 0 0 -d.add InterfaceName %s -d.add PrefixLength * 64 116 -set State:/Network/Service/zerops_vpn_service/IPv6 -set Setup:/Network/Service/zerops_vpn_service/IPv6`, data.InterfaceName) - - if _, err := h.runCommand(ctx, makeCommand("scutil", commandWithStdin(stdin))); err != nil { - return err - } - - return nil -} diff --git a/src/vpn/setVpn_darwin.go b/src/vpn/setVpn_darwin.go deleted file mode 100644 index 508516ab..00000000 --- a/src/vpn/setVpn_darwin.go +++ /dev/null @@ -1,119 +0,0 @@ -//go:build darwin -// +build darwin - -package vpn - -import ( - "context" - "errors" - "io/ioutil" - "net" - "net/netip" - "os/exec" - "strconv" - "strings" - "time" - - vpnproxy "github.com/zeropsio/zcli/src/proto/vpnproxy" - "golang.zx2c4.com/wireguard/wgctrl" - "golang.zx2c4.com/wireguard/wgctrl/wgtypes" - - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/utils/cmdRunner" -) - -const TunnelNameFile = "/tmp/wg-zerops" - -func (h *Handler) setVpn(ctx context.Context, vpnAddress net.IP, privateKey wgtypes.Key, mtu uint32, response *vpnproxy.StartVpnResponse) error { - var err error - - h.logger.Debug("run wireguard-go utun") - cmd := exec.Command("wireguard-go", "utun") - cmd.Env = []string{"WG_TUN_NAME_FILE=" + TunnelNameFile} - _, err = cmdRunner.Run(cmd) - if err != nil { - h.logger.Error(err) - return errors.New(i18n.VpnStartWireguardUtunError) - } - - interfaceName, err := func() (string, error) { - b, err := ioutil.ReadFile(TunnelNameFile) - if err != nil { - return "", err - } - return strings.TrimSpace(string(b)), nil - }() - if err != nil { - return errors.New(i18n.VpnStartNetworkInterfaceNotFound) - } - - clientIp := vpnproxy.FromProtoIP(response.GetVpn().GetAssignedClientIp()) - vpnRange := vpnproxy.FromProtoIPRange(response.GetVpn().GetVpnIpRange()) - serverIp := vpnproxy.FromProtoIP(response.GetVpn().GetServerIp()) - serverPublicKey, err := wgtypes.ParseKey(response.GetVpn().ServerPublicKey) - if err != nil { - return errors.New(i18n.VpnStartInvalidServerPublicKey) - } - - udpAddr, ok := netip.AddrFromSlice(vpnAddress) - if !ok { - return errors.New(i18n.VpnStartInvalidVpnAddress) - } - addr := net.UDPAddrFromAddrPort( - netip.AddrPortFrom( - udpAddr, - uint16(response.GetVpn().GetPort()), - ), - ) - - if err := h.runCommands( - ctx, - makeCommand( - "ifconfig", - commandWithErrorMessage(i18n.VpnStartUnableToConfigureNetworkInterface), - commandWithArgs(interfaceName, "inet6", clientIp.String(), "mtu", strconv.Itoa(int(mtu))), - ), - makeCommand( - "route", - commandWithErrorMessage(i18n.VpnStartUnableToUpdateRoutingTable), - commandWithArgs("add", "-inet6", vpnRange.String(), serverIp.String()), - ), - ); err != nil { - return err - } - - wgClient, err := wgctrl.New() - if err != nil { - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wgClient.Close() - - keep := time.Second * 25 - if err := wgClient.ConfigureDevice(interfaceName, wgtypes.Config{ - PrivateKey: &privateKey, - ListenPort: nil, - FirewallMark: nil, - ReplacePeers: true, - Peers: []wgtypes.PeerConfig{ - { - PublicKey: serverPublicKey, - Remove: false, - UpdateOnly: false, - PresharedKey: nil, - Endpoint: addr, - PersistentKeepaliveInterval: &keep, - ReplaceAllowedIPs: false, - AllowedIPs: []net.IPNet{ - { - IP: response.GetVpn().GetVpnIpRange().GetIp(), - Mask: response.GetVpn().GetVpnIpRange().GetMask(), - }, - }, - }, - }, - }); err != nil { - return errors.New(i18n.VpnStartTunnelConfigurationFailed) - } - - return nil -} diff --git a/src/vpn/setVpn_linux.go b/src/vpn/setVpn_linux.go deleted file mode 100644 index 357a0111..00000000 --- a/src/vpn/setVpn_linux.go +++ /dev/null @@ -1,123 +0,0 @@ -//go:build linux -// +build linux - -package vpn - -import ( - "context" - _ "embed" - "errors" - "net" - "net/netip" - "strconv" - "time" - - "github.com/lxc/lxd/shared/logger" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/proto/vpnproxy" - "golang.zx2c4.com/wireguard/wgctrl" - "golang.zx2c4.com/wireguard/wgctrl/wgtypes" -) - -const interfaceName = "zerops" - -func (h *Handler) setVpn(ctx context.Context, vpnAddress net.IP, privateKey wgtypes.Key, mtu uint32, response *vpnproxy.StartVpnResponse) error { - - clientIp := vpnproxy.FromProtoIP(response.GetVpn().GetAssignedClientIp()) - vpnRange := vpnproxy.FromProtoIPRange(response.GetVpn().GetVpnIpRange()) - serverPublicKey, err := wgtypes.ParseKey(response.GetVpn().ServerPublicKey) - if err != nil { - return err - } - udpAddr, ok := netip.AddrFromSlice(vpnAddress) - if !ok { - return errors.New(i18n.VpnStartInvalidVpnAddress) - } - addr := net.UDPAddrFromAddrPort( - netip.AddrPortFrom( - udpAddr, - uint16(response.GetVpn().GetPort()), - ), - ) - - interfaces, err := net.Interfaces() - if err != nil { - return err - } - for _, in := range interfaces { - if in.Name == interfaceName { - if err := h.runCommands( - ctx, - makeCommand( - "ip", - commandWithErrorMessage(i18n.VpnStopUnableToRemoveTunnelInterface), - commandWithArgs("link", "del", interfaceName), - ), - ); err != nil { - return err - } - } - } - - if err := h.runCommands( - ctx, - makeCommand( - "ip", - commandWithErrorMessage(i18n.VpnStartUnableToConfigureNetworkInterface), - commandWithArgs("link", "add", interfaceName, "type", "wireguard"), - ), - makeCommand( - "ip", - commandWithErrorMessage(i18n.VpnStartUnableToConfigureNetworkInterface), - commandWithArgs("-6", "address", "add", clientIp.String()+"/128", "dev", interfaceName), - ), - makeCommand( - "ip", - commandWithErrorMessage(i18n.VpnStartUnableToConfigureNetworkInterface), - commandWithArgs("link", "set", "dev", interfaceName, "mtu", strconv.Itoa(int(mtu)), "up"), - ), - makeCommand( - "ip", - commandWithErrorMessage(i18n.VpnStartUnableToUpdateRoutingTable), - commandWithArgs("route", "add", vpnRange.String(), "dev", interfaceName), - ), - ); err != nil { - return err - } - - wgClient, err := wgctrl.New() - if err != nil { - logger.Error(err.Error()) - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wgClient.Close() - keep := time.Second * 25 - if err := wgClient.ConfigureDevice(interfaceName, wgtypes.Config{ - PrivateKey: &privateKey, - ListenPort: nil, - FirewallMark: nil, - ReplacePeers: true, - Peers: []wgtypes.PeerConfig{ - { - PublicKey: serverPublicKey, - Remove: false, - UpdateOnly: false, - PresharedKey: nil, - Endpoint: addr, - PersistentKeepaliveInterval: &keep, - ReplaceAllowedIPs: false, - AllowedIPs: []net.IPNet{ - { - IP: response.GetVpn().GetVpnIpRange().GetIp(), - Mask: response.GetVpn().GetVpnIpRange().GetMask(), - }, - }, - }, - }, - }); err != nil { - logger.Error(err.Error()) - return errors.New(i18n.VpnStartTunnelConfigurationFailed) - } - - return nil -} diff --git a/src/vpn/setVpn_windows.go b/src/vpn/setVpn_windows.go deleted file mode 100644 index 82deddb2..00000000 --- a/src/vpn/setVpn_windows.go +++ /dev/null @@ -1,88 +0,0 @@ -//go:build windows - -package vpn - -import ( - "bytes" - "context" - "errors" - "net" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "text/template" - "time" - - "github.com/zeropsio/zcli/src/i18n" - vpnproxy "github.com/zeropsio/zcli/src/proto/vpnproxy" - "golang.zx2c4.com/wireguard/wgctrl/wgtypes" -) - -const Template = ` -[Interface] -PrivateKey = {{.ClientPrivateKey}} -Address = {{.ClientAddress}} -DNS = {{.DnsServers}}, zerops - -[Peer] -PublicKey = {{.ServerPublicKey}} -AllowedIPs = {{.AllowedIPs}} -Endpoint = {{.ServerAddress}} -PersistentKeepalive = 25 -` - -func (h *Handler) setVpn(ctx context.Context, selectedVpnAddress net.IP, privateKey wgtypes.Key, mtu uint32, response *vpnproxy.StartVpnResponse) error { - _, err := exec.LookPath("wireguard") - if err != nil { - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - - clientIp := vpnproxy.FromProtoIP(response.GetVpn().GetAssignedClientIp()) - vpnRange := vpnproxy.FromProtoIPRange(response.GetVpn().GetVpnIpRange()) - dnsIp := vpnproxy.FromProtoIP(response.GetVpn().GetDnsIp()) - tmpl := template.Must(template.New("").Parse(strings.Replace(Template, "\n", "\r\n", -1))) - - var bf bytes.Buffer - err = tmpl.Execute(&bf, struct { - ClientPrivateKey string - ClientAddress string - DnsServers string - - ServerPublicKey string - AllowedIPs string - ServerAddress string - }{ - ClientPrivateKey: privateKey.String(), - ClientAddress: clientIp.String(), - AllowedIPs: vpnRange.String(), - - DnsServers: dnsIp.String(), - ServerAddress: net.JoinHostPort(selectedVpnAddress.String(), strconv.Itoa(int(response.GetVpn().GetPort()))), - ServerPublicKey: response.GetVpn().GetServerPublicKey(), - }) - configFile := filepath.Join(os.TempDir(), "zerops.conf") - - err = os.WriteFile(configFile, bf.Bytes(), 0777) - if err != nil { - return err - } - - h.runCommands(ctx, - makeCommand( - "wireguard", - commandWithErrorMessage(i18n.VpnStartTunnelConfigurationFailed), - commandWithArgs("/installtunnelservice", configFile), - ), - makeCommand( - "netsh", - commandWithErrorMessage(i18n.VpnStartTunnelConfigurationFailed), - commandWithArgs("interface", "ipv4", "set", "subinterface", "zerops", "mtu="+strconv.Itoa(int(mtu))), - ), - ) - - time.Sleep(time.Second * 5) - - return nil -} diff --git a/src/vpn/startVpn.go b/src/vpn/startVpn.go deleted file mode 100644 index aeee7f17..00000000 --- a/src/vpn/startVpn.go +++ /dev/null @@ -1,226 +0,0 @@ -package vpn - -import ( - "context" - "errors" - "math/rand" - "net" - "sort" - "strconv" - "time" - - "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/daemonStorage" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/nettools" - "github.com/zeropsio/zcli/src/proto" - "github.com/zeropsio/zcli/src/proto/vpnproxy" - "github.com/zeropsio/zcli/src/proto/zBusinessZeropsApiProtocol" - "golang.zx2c4.com/wireguard/wgctrl" - "golang.zx2c4.com/wireguard/wgctrl/wgtypes" -) - -func (h *Handler) startVpn( - ctx context.Context, - grpcApiAddress string, - grpcVpnAddress string, - token string, - projectId string, - userId string, - mtu uint32, - caCertificateUrl string, - preferredPortMin uint32, - preferredPortMax uint32, -) (err error) { - defer func() { - if err != nil { - h.logger.Error(err) - cleanErr := h.stopVpn(ctx) - if cleanErr != nil { - h.logger.Error(cleanErr) - } - } - }() - - if err := h.stopVpn(ctx); err != nil { - return err - } - - privateKey, err := wgtypes.GeneratePrivateKey() - if err != nil { - return err - } - - apiClientFactory := zBusinessZeropsApiProtocol.New(zBusinessZeropsApiProtocol.Config{CaCertificateUrl: caCertificateUrl}) - apiGrpcClient, closeFunc, err := apiClientFactory.CreateClient(ctx, grpcApiAddress, token) - if err != nil { - return err - } - defer closeFunc() - - h.logger.Debug("vpn request start") - - apiVpnRequestResponse, err := apiGrpcClient.PostVpnRequest(ctx, &zBusinessZeropsApiProtocol.PostVpnRequestRequest{ - Id: projectId, - ClientPublicKey: privateKey.PublicKey().String(), - }) - if err := proto.BusinessError(apiVpnRequestResponse, err); err != nil { - return err - } - h.logger.Debug("vpn request end") - - accessToken := apiVpnRequestResponse.GetOutput().GetAccessToken() - expiry := apiVpnRequestResponse.GetOutput().GetExpiry() - - h.logger.Debugf("get vpn addresses start %s", grpcVpnAddress) - - ipRecords, err := net.LookupIP(grpcVpnAddress) - if err != nil { - return err - } - - h.logger.Debug("get vpn addresses end") - - sort.Slice(ipRecords, func(i, j int) bool { return rand.Int()%2 == 0 }) - - vpnAddress := nettools.PickIP(constants.VpnApiGrpcPort, ipRecords...) - if vpnAddress == nil { - return errors.New(i18n.VpnStartVpnNotReachable) - } - - targetVpnAddress := net.JoinHostPort(vpnAddress.String(), constants.VpnApiGrpcPort) - - vpnGrpcClient, closeFunc, err := vpnproxy.CreateClient(ctx, targetVpnAddress) - if err != nil { - return err - } - defer closeFunc() - - h.logger.Debug("call start vpn - start") - h.logger.Debug("preferredPortMin: ", preferredPortMin) - h.logger.Debug("preferredPortMax: ", preferredPortMax) - - startVpnResponse, err := vpnGrpcClient.StartVpn(ctx, &vpnproxy.StartVpnRequest{ - AccessToken: accessToken, - PreferredPortMin: preferredPortMin, - PreferredPortMax: preferredPortMax, - }) - - if err := proto.VpnError(startVpnResponse, err); err != nil { - return err - } - - h.logger.Debug("call start vpn - end") - - clientIp := vpnproxy.FromProtoIP(startVpnResponse.GetVpn().GetAssignedClientIp()) - vpnRange := vpnproxy.FromProtoIPRange(startVpnResponse.GetVpn().GetVpnIpRange()) - serverIp := vpnproxy.FromProtoIP(startVpnResponse.GetVpn().GetServerIp()) - - h.logger.Debug("assigned client address: " + clientIp.String()) - h.logger.Debug("assigned vpn server: " + vpnAddress.String() + ":" + strconv.Itoa(int(startVpnResponse.GetVpn().GetPort()))) - h.logger.Debug("server public key: " + startVpnResponse.GetVpn().GetServerPublicKey()) - h.logger.Debug("serverIp address: " + serverIp.String()) - h.logger.Debug("vpnRange: " + vpnRange.String()) - h.logger.Debug("mtu: " + strconv.Itoa(int(mtu))) - - if err := h.setVpn(ctx, vpnAddress, privateKey, mtu, startVpnResponse); err != nil { - return err - } - - if err := h.updateVpnInterfaceName(privateKey); err != nil { - return err - } - - dnsManagement, err := DnsDetect() - if err != nil { - h.logger.Error(err) - return err - } - - vpnNetwork := net.IPNet{ - IP: startVpnResponse.GetVpn().VpnIpRange.GetIp(), - Mask: startVpnResponse.GetVpn().VpnIpRange.GetMask(), - } - - dnsIp := vpnproxy.FromProtoIP(startVpnResponse.GetVpn().GetDnsIp()) - - data, err := h.storage.Update(func(data daemonStorage.Data) daemonStorage.Data { - data.ServerIp = serverIp - data.VpnNetwork = vpnNetwork - data.ProjectId = projectId - data.UserId = userId - data.Mtu = mtu - data.DnsIp = dnsIp - data.ClientIp = clientIp - data.GrpcApiAddress = grpcApiAddress - data.GrpcVpnAddress = grpcVpnAddress - data.GrpcTargetVpnAddress = targetVpnAddress - data.Token = token - data.DnsManagement = dnsManagement - data.CaCertificateUrl = caCertificateUrl - data.PreferredPortMin = preferredPortMin - data.PreferredPortMax = preferredPortMax - data.Expiry = zBusinessZeropsApiProtocol.FromProtoTimestamp(expiry) - return data - }) - if err != nil { - h.logger.Error(err) - return errors.New(i18n.DaemonUnableToSaveConfiguration) - } - - if err := h.setDns(ctx); err != nil { - h.logger.Error(err) - return err - } - - data = h.storage.Data() - - h.logger.Debugf("dnsIp: %s", data.DnsIp.String()) - h.logger.Debugf("clientIp: %s", data.ClientIp.String()) - h.logger.Debugf("dnsManagementType: %s", data.DnsManagement) - h.logger.Debugf("serverIp: %s", data.ServerIp.String()) - h.logger.Debugf("vpnNetwork: %s", data.VpnNetwork.String()) - h.logger.Debugf("interface: %s", data.InterfaceName) - h.logger.Debugf("mtu: %d", data.Mtu) - h.logger.Debugf("preferredPortMin: %d", data.PreferredPortMin) - h.logger.Debugf("preferredPortMax: %d", data.PreferredPortMax) - - time.Sleep(time.Second * 3) - h.logger.Debug("try vpn") - - if !h.isVpnTunnelAlive(ctx, serverIp) { - if err := h.stopVpn(ctx); err != nil { - h.logger.Error(err) - return err - } - return errors.New(i18n.VpnStartTunnelIsNotAlive) - } - return nil -} - -func (h *Handler) updateVpnInterfaceName(privateKey wgtypes.Key) error { - wgClient, err := wgctrl.New() - if err != nil { - h.logger.Error(err) - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - defer wgClient.Close() - - wgDevices, err := wgClient.Devices() - if err != nil { - h.logger.Error(err) - return errors.New(i18n.VpnStatusWireguardNotAvailable) - } - for _, device := range wgDevices { - device := device - if device.PrivateKey.String() == privateKey.String() { - h.storage.Update(func(data daemonStorage.Data) daemonStorage.Data { - data.InterfaceName = device.Name - h.logger.Info("set device", data.InterfaceName) - return data - }) - return nil - } - } - return errors.New(i18n.VpnStatusDnsInterfaceNotFound) -} diff --git a/src/vpn/stopVpn.go b/src/vpn/stopVpn.go deleted file mode 100644 index 204a054c..00000000 --- a/src/vpn/stopVpn.go +++ /dev/null @@ -1,31 +0,0 @@ -package vpn - -import ( - "context" -) - -func (h *Handler) stopVpn(ctx context.Context) error { - h.logger.Debug("stopping VPN") - data := h.storage.Data() - - if data.InterfaceName == "" { - return nil - } - - h.logger.Debug("clean vpn start") - if err := h.cleanVpn(ctx, data.InterfaceName); err != nil { - return err - } - h.logger.Debug("clean vpn end") - - h.logger.Debug("clean vpn DNS") - if err := h.DnsClean(ctx); err != nil { - return err - } - h.logger.Debug("clean DNS start") - - if err := h.storage.Clear(); err != nil { - return err - } - return nil -} diff --git a/src/yamlReader/readYaml.go b/src/yamlReader/readYaml.go new file mode 100644 index 00000000..aac56c9e --- /dev/null +++ b/src/yamlReader/readYaml.go @@ -0,0 +1,53 @@ +package yamlReader + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" +) + +func ReadContent(uxBlocks *uxBlock.UxBlocks, importYamlPath string, workingDir string) ([]byte, error) { + if !filepath.IsAbs(importYamlPath) { + workingDir, err := filepath.Abs(workingDir) + if err != nil { + return nil, err + } + + importYamlPath = filepath.Join(workingDir, importYamlPath) + } + + fileInfo, err := os.Stat(importYamlPath) + if err != nil { + return nil, err + } + + if fileInfo.IsDir() { + return nil, errors.New(i18n.T(i18n.ImportYamlNotFound)) + } + + uxBlocks.PrintLine(fmt.Sprintf("%s: %s", i18n.T(i18n.ImportYamlFound), importYamlPath)) + + if fileInfo.Size() == 0 { + return nil, errors.New(i18n.T(i18n.ImportYamlEmpty)) + } + + if fileInfo.Size() > 100*1024 { + return nil, errors.New(i18n.T(i18n.ImportYamlTooLarge)) + } + + yamlContent, err := os.ReadFile(importYamlPath) + if err != nil { + return nil, err + } + + if len(yamlContent) == 0 { + return nil, errors.New(i18n.T(i18n.ImportYamlCorrupted)) + } + + uxBlocks.PrintLine(i18n.T(i18n.ImportYamlOk)) + return yamlContent, nil +} diff --git a/src/zeropsRestApiClient/errors.go b/src/zeropsRestApiClient/errors.go new file mode 100644 index 00000000..873af9da --- /dev/null +++ b/src/zeropsRestApiClient/errors.go @@ -0,0 +1,68 @@ +package zeropsRestApiClient + +import ( + "github.com/pkg/errors" + "github.com/zeropsio/zerops-go/apiError" + "github.com/zeropsio/zerops-go/errorCode" +) + +type checkErrorConfig struct { + checks []func(error) error +} + +func CheckInvalidUserInput(paramName string, returnedErr error) CheckErrorOption { + return func(cfg *checkErrorConfig) { + cfg.checks = append(cfg.checks, func(err error) error { + var apiErr apiError.Error + if errors.As(err, &apiErr) { + if apiErr.GetErrorCode() == string(errorCode.InvalidUserInput) { + if typedMeta, ok := apiErr.GetMeta().([]interface{}); ok { + if len(typedMeta) > 0 { + if typed, ok := typedMeta[0].(map[string]interface{}); ok { + if param, exists := typed["parameter"]; exists { + if value, ok := param.(string); ok && value == paramName { + return returnedErr + } + } + } + } + } + } + } + + return nil + }) + } +} + +func CheckErrorCode(errorCode errorCode.ErrorCode, returnedErr error) CheckErrorOption { + return func(cfg *checkErrorConfig) { + cfg.checks = append(cfg.checks, func(err error) error { + var apiErr apiError.Error + if errors.As(err, &apiErr) { + if apiErr.GetErrorCode() == string(errorCode) { + return returnedErr + } + } + + return nil + }) + } +} + +type CheckErrorOption = func(cfg *checkErrorConfig) + +func CheckError(err error, auxOptions ...CheckErrorOption) error { + cfg := checkErrorConfig{} + for _, opt := range auxOptions { + opt(&cfg) + } + + for _, check := range cfg.checks { + if err := check(err); err != nil { + return err + } + } + + return err +} diff --git a/src/zeropsRestApiClient/handler.go b/src/zeropsRestApiClient/handler.go new file mode 100644 index 00000000..388e9d54 --- /dev/null +++ b/src/zeropsRestApiClient/handler.go @@ -0,0 +1,24 @@ +// Package zeropsRestApiClient provides a client for the zerops rest api +package zeropsRestApiClient + +import ( + "net/http" + + "github.com/zeropsio/zerops-go/sdk" + "github.com/zeropsio/zerops-go/sdkBase" +) + +type Handler struct { + sdk.Handler + env sdkBase.Environment +} + +func NewAuthorizedClient(token string, regionUrl string) *Handler { + config := sdkBase.DefaultConfig(sdkBase.WithCustomEndpoint(regionUrl)) + + return &Handler{ + Handler: sdk.AuthorizeSdk(sdk.New(config, http.DefaultClient), token), + // temporary solution, I need my own endpoints + env: sdkBase.NewEnvironment(config, http.DefaultClient).Authorize(token), + } +} diff --git a/src/zeropsRestApiClient/handler_get_projects_by_client.go b/src/zeropsRestApiClient/handler_get_projects_by_client.go new file mode 100644 index 00000000..c548af3a --- /dev/null +++ b/src/zeropsRestApiClient/handler_get_projects_by_client.go @@ -0,0 +1,98 @@ +// Package zeropsRestApiClient provides a client for the zerops rest api +package zeropsRestApiClient + +import ( + "context" + "encoding/json" + "net/http" + + "github.com/pkg/errors" + "github.com/zeropsio/zerops-go/apiError" + "github.com/zeropsio/zerops-go/sdkBase" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func (h *Handler) GetProjectsByClient( + ctx context.Context, + clientId uuid.ClientId, +) (GetProjectsByClientResponse, error) { + var response GetProjectsByClientResponse + + u := "/api/rest/public/project/search" + + filter := EsFilter{ + Search: []EsSearchItem{ + { + Name: "clientId", + Operator: "eq", + Value: clientId.Native(), + }, + }, + } + + sdkResponse := sdkBase.Post(ctx, h.env, u, filter) + + if sdkResponse.Err != nil { + return response, sdkResponse.Err + } + response.responseHeaders = sdkResponse.HttpResponse.Header + response.responseStatusCode = sdkResponse.HttpResponse.StatusCode + + decoder := json.NewDecoder(sdkResponse.ResponseData) + if sdkResponse.HttpResponse.StatusCode < http.StatusMultipleChoices { + if err := decoder.Decode(&response.success); err != nil { + return response, err + } + } else { + responseString := sdkResponse.ResponseData.String() + apiErrorResponse := struct { + Error apiError.Error `json:"error"` + }{} + err := decoder.Decode(&apiErrorResponse) + if err != nil { + return response, errors.New(sdkResponse.HttpResponse.Status + ": " + responseString) + } + apiErrorResponse.Error.HttpStatusCode = sdkResponse.HttpResponse.StatusCode + response.err = apiErrorResponse.Error + } + + return response, nil +} + +type EsFilter struct { + Search []EsSearchItem `json:"search"` +} + +type EsSearchItem struct { + Name string `json:"name"` + Operator string `json:"operator"` + Value string `json:"value"` +} + +type GetProjectsByClientResponse struct { + success EsProjectResponse + err error + responseHeaders http.Header + responseStatusCode int +} + +func (r GetProjectsByClientResponse) Output() (output EsProjectResponse, err error) { + return r.success, r.err +} + +type EsProjectResponse struct { + Limit int64 `json:"limit"` + Offset int64 `json:"offset"` + TotalHits int64 `json:"totalHits"` + Items []EsProject `json:"items"` +} + +type EsProject struct { + Id uuid.ProjectId `json:"id"` + ClientId uuid.ClientId `json:"clientId"` + Name types.String `json:"name"` + Description types.TextNull `json:"description"` + Status enum.ProjectStatusEnum `json:"status"` +} diff --git a/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go b/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go new file mode 100644 index 00000000..cc2b6201 --- /dev/null +++ b/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go @@ -0,0 +1,106 @@ +// Package zeropsRestApiClient provides a client for the zerops rest api +package zeropsRestApiClient + +import ( + "context" + "encoding/json" + "errors" + "net/http" + + "github.com/zeropsio/zerops-go/apiError" + "github.com/zeropsio/zerops-go/sdkBase" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/stringId" + "github.com/zeropsio/zerops-go/types/uuid" +) + +func (h *Handler) GetServiceStackByProject( + ctx context.Context, + projectId uuid.ProjectId, + clientId uuid.ClientId, +) (GetServiceStackByProjectResponse, error) { + var response GetServiceStackByProjectResponse + + u := "/api/rest/public/service-stack/search" + + filter := EsFilter{ + Search: []EsSearchItem{ + { + Name: "projectId", + Operator: "eq", + Value: projectId.Native(), + }, + { + Name: "clientId", + Operator: "eq", + Value: clientId.Native(), + }, + }, + } + + sdkResponse := sdkBase.Post(ctx, h.env, u, filter) + + if sdkResponse.Err != nil { + return response, sdkResponse.Err + } + response.responseHeaders = sdkResponse.HttpResponse.Header + response.responseStatusCode = sdkResponse.HttpResponse.StatusCode + + decoder := json.NewDecoder(sdkResponse.ResponseData) + if sdkResponse.HttpResponse.StatusCode < http.StatusMultipleChoices { + if err := decoder.Decode(&response.success); err != nil { + return response, err + } + } else { + responseString := sdkResponse.ResponseData.String() + apiErrorResponse := struct { + Error apiError.Error `json:"error"` + }{} + err := decoder.Decode(&apiErrorResponse) + if err != nil { + return response, errors.New(sdkResponse.HttpResponse.Status + ": " + responseString) + } + apiErrorResponse.Error.HttpStatusCode = sdkResponse.HttpResponse.StatusCode + response.err = apiErrorResponse.Error + } + + return response, nil +} + +type GetServiceStackByProjectResponse struct { + success EsServiceStackResponse + err error + responseHeaders http.Header + responseStatusCode int +} + +func (r GetServiceStackByProjectResponse) Output() (output EsServiceStackResponse, err error) { + return r.success, r.err +} + +type EsServiceStackResponse struct { + Limit int `json:"limit"` + Offset int `json:"offset"` + TotalHits int `json:"totalHits"` + Items []EsServiceStack `json:"items"` +} + +type EsServiceStack struct { + Id uuid.ServiceStackId `json:"id"` + ProjectId uuid.ProjectId `json:"projectId"` + ClientId uuid.ClientId `json:"clientId"` + ServiceStackTypeId stringId.ServiceStackTypeId `json:"serviceStackTypeId"` + ServiceStackTypeVersionId stringId.ServiceStackTypeVersionId `json:"serviceStackTypeVersionId"` + Status enum.ServiceStackStatusEnum `json:"status"` + Name types.String `json:"name"` + IsSystem types.Bool `json:"isSystem"` + ServiceStackTypeInfo EsServiceStackInfoJsonObject `json:"serviceStackTypeInfo"` +} + +type EsServiceStackInfoJsonObject struct { + ServiceStackTypeName types.String `json:"serviceStackTypeName"` // serviceStackTypeName - types.String + ServiceStackTypeCategory enum.ServiceStackTypeCategoryEnum `json:"serviceStackTypeCategory"` // serviceStackTypeCategory - enum.ServiceStackTypeCategoryEnum + ServiceStackTypeVersionName types.String `json:"serviceStackTypeVersionName"` // serviceStackTypeVersionName - types.String + +} From 8fcf5d26c0284f9c5b4c8143c49d89d0eb004899 Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Sun, 21 Jan 2024 23:03:51 +0100 Subject: [PATCH 02/12] fix workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 37594b50..78e24f4d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -46,7 +46,7 @@ jobs: - name: Set up Go 1.x uses: actions/setup-go@v3 with: - go-version: ~1.18 + go-version: ~1.21 id: go - name: Check out code into the Go module directory From 42ea9662eab0f8be7ac0bb0c04e0df8261a428e1 Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Sun, 21 Jan 2024 23:06:05 +0100 Subject: [PATCH 03/12] fix main.go --- src/uxBlock/showcase/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uxBlock/showcase/main.go b/src/uxBlock/showcase/main.go index 6d5405d2..d7afcd49 100644 --- a/src/uxBlock/showcase/main.go +++ b/src/uxBlock/showcase/main.go @@ -156,7 +156,7 @@ func createBlocks(contextCancelFunc func()) (*UxBlocks, error) { FilePath: "zerops.log", }) - blocks := NewBlock(outputLogger, debugFileLogger, isTerminal, contextCancelFunc, []string{}) + blocks := NewBlock(outputLogger, debugFileLogger, isTerminal, contextCancelFunc) return blocks, nil } From 624c5411645310e2afe7c620a7913d9c34a97a06 Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Sun, 21 Jan 2024 23:10:03 +0100 Subject: [PATCH 04/12] fix constants --- src/constants/linux.go | 5 +++++ src/constants/windows.go | 1 + 2 files changed, 6 insertions(+) diff --git a/src/constants/linux.go b/src/constants/linux.go index 91a4db19..596eb93b 100644 --- a/src/constants/linux.go +++ b/src/constants/linux.go @@ -3,6 +3,11 @@ package constants +import ( + "os" + "path" +) + func getDataFilePaths() []pathReceiver { return []pathReceiver{ receiverWithPath(os.UserConfigDir, zeropsDir, cliDataFileName), diff --git a/src/constants/windows.go b/src/constants/windows.go index aa52bd16..604f5299 100644 --- a/src/constants/windows.go +++ b/src/constants/windows.go @@ -5,6 +5,7 @@ package constants import ( "os" + "path" ) func getDataFilePaths() []pathReceiver { From 6ed51d8e9f3a1cc1fd3c028b84a71ed49f5ed80f Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Sun, 21 Jan 2024 23:32:11 +0100 Subject: [PATCH 05/12] update linter && fix violations --- src/cmd/bucket.go | 2 +- src/cmd/bucketS3.go | 2 +- src/cmd/bucketS3Delete.go | 2 +- src/cmd/bucketZeropsDelete.go | 4 ++-- src/cmd/login.go | 2 +- src/cmd/projectDelete.go | 2 +- src/cmd/projectImport.go | 8 ++++---- src/cmd/scopeProject.go | 2 +- src/cmd/scopeReset.go | 2 +- src/cmd/serviceDelete.go | 2 +- src/cmd/serviceDeploy.go | 4 ++-- src/cmd/serviceLog.go | 2 +- src/cmd/servicePush.go | 6 +++--- src/cmd/statusShowDebugLogs.go | 2 +- src/cmd/uxHelpers.go | 4 ++-- src/cmdBuilder/cmdBuilderCreateRunFunc.go | 14 +++++++------- .../cmdBuilderCreateRunFunc_test.go | 1 + src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 6 +++--- src/cmdBuilder/dependencyTree.go | 4 ++-- src/cmdBuilder/dependencyTreeProject.go | 2 +- src/cmdBuilder/dependencyTreeService.go | 2 +- src/constants/darwin.go | 7 +++++++ src/constants/linux.go | 16 ++++++++++++++++ src/constants/windows.go | 19 +++++++++++++++++-- src/constants/zerops.go | 2 +- src/httpClient/handler.go | 9 +-------- src/logger/handler.go | 7 ------- src/serviceLogs/handler_checkInputValues.go | 2 +- src/serviceLogs/handler_getLogs.go | 4 ++-- src/serviceLogs/handler_run.go | 2 +- src/serviceLogs/handler_ws.go | 3 ++- src/storage/handler.go | 9 ++++++--- src/uxBlock/blocks.go | 2 +- src/uxBlock/prompt.go | 5 ++--- src/uxBlock/select.go | 2 +- src/uxBlock/spinner.go | 4 ++-- src/uxHelpers/project.go | 2 +- src/uxHelpers/service.go | 2 +- src/uxHelpers/spinner.go | 2 +- tools/install.sh | 2 +- 40 files changed, 102 insertions(+), 74 deletions(-) diff --git a/src/cmd/bucket.go b/src/cmd/bucket.go index e3c17b51..5c6f944b 100644 --- a/src/cmd/bucket.go +++ b/src/cmd/bucket.go @@ -15,7 +15,7 @@ func bucketCmd() *cmdBuilder.Cmd { AddChildrenCmd(bucketS3Cmd()) } -// FIXME - janhajek better place? +// TODO - janhajek better place? const ( xAmzAclName = "x-amz-acl" ) diff --git a/src/cmd/bucketS3.go b/src/cmd/bucketS3.go index 74550c15..08a76aa1 100644 --- a/src/cmd/bucketS3.go +++ b/src/cmd/bucketS3.go @@ -16,7 +16,7 @@ func bucketS3Cmd() *cmdBuilder.Cmd { AddChildrenCmd(bucketS3DeleteCmd()) } -// FIXME - janhajek better place? +// TODO - janhajek better place? const ( s3ServerRegion = "us-east-1" accessKeyIdName = "accessKeyId" diff --git a/src/cmd/bucketS3Delete.go b/src/cmd/bucketS3Delete.go index da069cb7..fd472e54 100644 --- a/src/cmd/bucketS3Delete.go +++ b/src/cmd/bucketS3Delete.go @@ -42,7 +42,7 @@ func bucketS3DeleteCmd() *cmdBuilder.Cmd { } if !confirm { - // FIXME - janhajek message + // TODO - janhajek message fmt.Println("you have to confirm it") return nil } diff --git a/src/cmd/bucketZeropsDelete.go b/src/cmd/bucketZeropsDelete.go index c4912f75..560d92a8 100644 --- a/src/cmd/bucketZeropsDelete.go +++ b/src/cmd/bucketZeropsDelete.go @@ -27,7 +27,7 @@ func bucketZeropsDeleteCmd() *cmdBuilder.Cmd { } serviceId := cmdData.Service.ID - // FIXME - janhajek duplicate + // TODO - janhajek duplicate bucketName := fmt.Sprintf("%s.%s", strings.ToLower(serviceId.Native()), cmdData.Args["bucketName"][0]) confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) @@ -36,7 +36,7 @@ func bucketZeropsDeleteCmd() *cmdBuilder.Cmd { } if !confirm { - // FIXME - janhajek message + // TODO - janhajek message fmt.Println("you have to confirm it") return nil } diff --git a/src/cmd/login.go b/src/cmd/login.go index 22474f08..d3a7c9dc 100644 --- a/src/cmd/login.go +++ b/src/cmd/login.go @@ -93,7 +93,7 @@ func getLoginRegion( } } - // FIXME - janhajek translation + // TODO - janhajek translation header := (&uxBlock.TableRow{}).AddStringCells("Name") tableBody := &uxBlock.TableBody{} diff --git a/src/cmd/projectDelete.go b/src/cmd/projectDelete.go index b60f3812..8c06e59b 100644 --- a/src/cmd/projectDelete.go +++ b/src/cmd/projectDelete.go @@ -24,7 +24,7 @@ func projectDeleteCmd() *cmdBuilder.Cmd { } if !confirm { - // FIXME - janhajek message + // TODO - janhajek message fmt.Println("you have to confirm it") return nil } diff --git a/src/cmd/projectImport.go b/src/cmd/projectImport.go index 73a40ee6..03def1e3 100644 --- a/src/cmd/projectImport.go +++ b/src/cmd/projectImport.go @@ -23,10 +23,10 @@ func projectImportCmd() *cmdBuilder.Cmd { LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks - // FIXME - janhajek client via flag - // FIXME - janhajek interactive selector of clients + // TODO - janhajek client via flag + // TODO - janhajek interactive selector of clients - // FIXME - janhajek config + // TODO - janhajek config yamlContent, err := yamlReader.ReadContent(uxBlocks, cmdData.Args[projectImportArgName][0], "./") if err != nil { return err @@ -35,7 +35,7 @@ func projectImportCmd() *cmdBuilder.Cmd { importProjectResponse, err := cmdData.RestApiClient.PostProjectImport( ctx, body.ProjectImport{ - // FIXME - janhajek client id + // TODO - janhajek client id ClientId: uuid.ClientId(cmdData.Args[projectImportArgName][0]), Yaml: types.Text(yamlContent), }, diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go index ec645568..4b99d20e 100644 --- a/src/cmd/scopeProject.go +++ b/src/cmd/scopeProject.go @@ -28,7 +28,7 @@ func scopeProjectCmd() *cmdBuilder.Cmd { } cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) } else { - // FIXME - janhajek message + // TODO - janhajek message cmdData.UxBlocks.PrintInfoLine("previously scoped project: " + project.Name.String()) } } diff --git a/src/cmd/scopeReset.go b/src/cmd/scopeReset.go index a8317bda..c92dc602 100644 --- a/src/cmd/scopeReset.go +++ b/src/cmd/scopeReset.go @@ -22,7 +22,7 @@ func scopeResetCmd() *cmdBuilder.Cmd { return err } - // FIXME - janhajek message + // TODO - janhajek message cmdData.UxBlocks.PrintInfoLine("scope reset") return nil diff --git a/src/cmd/serviceDelete.go b/src/cmd/serviceDelete.go index c59c466a..f1357892 100644 --- a/src/cmd/serviceDelete.go +++ b/src/cmd/serviceDelete.go @@ -23,7 +23,7 @@ func serviceDeleteCmd() *cmdBuilder.Cmd { } if !confirm { - // FIXME - janhajek message + // TODO - janhajek message fmt.Println("you have to confirm it") return nil } diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go index 434720bb..f1b7a0c7 100644 --- a/src/cmd/serviceDeploy.go +++ b/src/cmd/serviceDeploy.go @@ -84,12 +84,12 @@ func serviceDeployCmd() *cmdBuilder.Cmd { return err } - // FIXME - janhajek merge with sdk client? + // TODO - janhajek merge with sdk client? httpClient := httpClient.New(ctx, httpClient.Config{ HttpTimeout: time.Minute * 15, }) - // FIXME - janhajek spinner? + // TODO - janhajek spinner? uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageStart)) if err := packageUpload(httpClient, appVersion.UploadUrl.String(), r); err != nil { // if an error occurred while packing the app, return that error diff --git a/src/cmd/serviceLog.go b/src/cmd/serviceLog.go index 49209037..a0b1f354 100644 --- a/src/cmd/serviceLog.go +++ b/src/cmd/serviceLog.go @@ -64,7 +64,7 @@ func serviceLogCmd() *cmdBuilder.Cmd { Format: cmdData.Params.GetString("format"), FormatTemplate: cmdData.Params.GetString("formatTemplate"), Follow: cmdData.Params.GetBool("follow"), - // FIXME - janhajek better place? + // TODO - janhajek better place? Levels: serviceLogs.Levels{ {"EMERGENCY", "0"}, {"ALERT", "1"}, diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go index 34bfb4da..fef91438 100644 --- a/src/cmd/servicePush.go +++ b/src/cmd/servicePush.go @@ -23,7 +23,7 @@ import ( "github.com/zeropsio/zerops-go/types" ) -// FIXME - janhajek shared +// TODO - janhajek shared const ZeropsYamlFileName = "zerops.yaml" func servicePushCmd() *cmdBuilder.Cmd { @@ -78,12 +78,12 @@ func servicePushCmd() *cmdBuilder.Cmd { return err } - // FIXME - janhajek merge with sdk client + // TODO - janhajek merge with sdk client HttpClient := httpClient.New(ctx, httpClient.Config{ HttpTimeout: time.Minute * 15, }) - // FIXME - janhajek spinner? + // TODO - janhajek spinner? uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageStart)) if err := packageUpload(HttpClient, appVersion.UploadUrl.String(), r); err != nil { // if an error occurred while packing the app, return that error diff --git a/src/cmd/statusShowDebugLogs.go b/src/cmd/statusShowDebugLogs.go index e1ed0578..e083ff3b 100644 --- a/src/cmd/statusShowDebugLogs.go +++ b/src/cmd/statusShowDebugLogs.go @@ -32,7 +32,7 @@ func statusShowDebugLogsCmd() *cmdBuilder.Cmd { filesize := stat.Size() if filesize == 0 { - // FIXME - janhajek translate + // TODO - janhajek translate fmt.Println("No logs found") return nil } diff --git a/src/cmd/uxHelpers.go b/src/cmd/uxHelpers.go index 426870cd..4fb3429c 100644 --- a/src/cmd/uxHelpers.go +++ b/src/cmd/uxHelpers.go @@ -11,7 +11,7 @@ func YesNoPromptDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserC return true, nil } - // FIXME - janhajek translate + // TODO - janhajek translate choices := []string{"no", "yes"} choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) if err != nil { @@ -26,7 +26,7 @@ func YesNoPromptNonDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUs return true, nil } - // FIXME - janhajek translate + // TODO - janhajek translate choices := []string{"no", "yes"} choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) if err != nil { diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index 5f59ec62..a161e3b3 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -145,16 +145,16 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co cmdData.RestApiClient = zeropsRestApiClient.NewAuthorizedClient(token, storedData.RegionData.RestApiAddress) for _, dep := range getDependencyListFromRoot(cmd.scopeLevel) { - err := dep.LoadSelectedScope(cobraCmd.Context(), cmd, cmdData) + err := dep.LoadSelectedScope(ctx, cmd, cmdData) if err != nil { return err } } - return cmd.loggedUserRunFunc(cobraCmd.Context(), cmdData) + return cmd.loggedUserRunFunc(ctx, cmdData) } - return cmd.guestRunFunc(cobraCmd.Context(), guestCmdData) + return cmd.guestRunFunc(ctx, guestCmdData) } } @@ -175,13 +175,13 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { } if len(args) < requiredArgsCount { - // FIXME - janhajek message + // TODO - janhajek message return nil, errors.Errorf("expected at least %d arg(s), got %d", requiredArgsCount, len(args)) } // the last arg is not an array, max number of given args can't be greater than the number of registered args if !isArray && len(args) > len(cmd.args) { - // FIXME - janhajek message + // TODO - janhajek message return nil, errors.Errorf("expected no more than %d arg(s), got %d", len(cmd.args), len(args)) } @@ -233,7 +233,7 @@ func getQuietMode(isTerminal bool) (QuietMode, error) { case QuietModeConfirmNothing, QuietModeConfirmAll, QuietModeConfirmOnlyDestructive: return QuietMode(QuietModeFlag), nil default: - // FIXME - janhajek message + // TODO - janhajek message return 0, errors.New("unknown quiet mode") } } @@ -247,7 +247,7 @@ func isTerminal() (bool, error) { case TerminalModeEnabled: return true, nil default: - // FIXME - janhajek message + // TODO - janhajek message return false, errors.New("unknown terminal mode") } } diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go b/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go index 5f1adb13..41f60710 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc_test.go @@ -165,6 +165,7 @@ func TestConvertArgs(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { got, err := convertArgs(tt.args.cmd, tt.args.args) if tt.wantErr != "" { diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go index a6a434af..1db123f2 100644 --- a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -23,8 +23,8 @@ type TerminalMode string const ( TerminalModeAuto TerminalMode = "auto" - TerminalModeDisabled = "disabled" - TerminalModeEnabled = "enabled" + TerminalModeDisabled TerminalMode = "disabled" + TerminalModeEnabled TerminalMode = "enabled" ) var TerminalFlag string @@ -71,7 +71,7 @@ func createRootCommand() *cobra.Command { SilenceErrors: true, } - // FIXME - janhajek add a dynamic help for subcommands + // TODO - janhajek add a dynamic help for subcommands rootCmd.Flags().BoolP("help", "h", false, i18n.T(i18n.DisplayHelp)+i18n.T(i18n.GroupHelp)) rootCmd.PersistentFlags().IntVar(&QuietModeFlag, "quiet", int(QuietModeConfirmAll), i18n.T(i18n.QuietModeFlag)) diff --git a/src/cmdBuilder/dependencyTree.go b/src/cmdBuilder/dependencyTree.go index d6b54c11..1612123a 100644 --- a/src/cmdBuilder/dependencyTree.go +++ b/src/cmdBuilder/dependencyTree.go @@ -5,7 +5,7 @@ import ( "slices" ) -// FIXME - janhajek do we need interface? +// TODO - janhajek do we need interface? type Dependency interface { AddCommandFlags(*Cmd) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error @@ -20,7 +20,7 @@ func (c *commonDependency) GetParent() Dependency { return c.parent } -// FIXME - janhajek move back cmd? +// TODO - janhajek move back cmd? var Project *project var Service *service diff --git a/src/cmdBuilder/dependencyTreeProject.go b/src/cmdBuilder/dependencyTreeProject.go index ffb6d730..defaecdf 100644 --- a/src/cmdBuilder/dependencyTreeProject.go +++ b/src/cmdBuilder/dependencyTreeProject.go @@ -18,7 +18,7 @@ type project struct { const ProjectArgName = "projectId" func (p *project) AddCommandFlags(cmd *Cmd) { - // FIXME - janhajek translation + // TODO - janhajek translation cmd.StringFlag(ProjectArgName, "", "Project id") } diff --git a/src/cmdBuilder/dependencyTreeService.go b/src/cmdBuilder/dependencyTreeService.go index e5f10697..1d5c82ba 100644 --- a/src/cmdBuilder/dependencyTreeService.go +++ b/src/cmdBuilder/dependencyTreeService.go @@ -18,7 +18,7 @@ const ServiceArgName = "serviceIdOrName" const ServiceFlagName = "serviceId" func (s *service) AddCommandFlags(cmd *Cmd) { - // FIXME - janhajek translation + // TODO - janhajek translation cmd.StringFlag(ServiceFlagName, "", "Service id") } diff --git a/src/constants/darwin.go b/src/constants/darwin.go index ecb32b7d..6c8032f5 100644 --- a/src/constants/darwin.go +++ b/src/constants/darwin.go @@ -26,6 +26,13 @@ func getDataFilePaths() []pathReceiver { func getLogFilePath() []pathReceiver { return []pathReceiver{ + func() (string, error) { + env := os.Getenv(cliLogFilePathEnvVar) + if env != "" { + return env, nil + } + return "", errors.New("env is empty") + }, func() (string, error) { return path.Join("/usr/local/var/log/", zeropsLogFile), nil }, diff --git a/src/constants/linux.go b/src/constants/linux.go index 596eb93b..989649e9 100644 --- a/src/constants/linux.go +++ b/src/constants/linux.go @@ -6,10 +6,19 @@ package constants import ( "os" "path" + + "github.com/pkg/errors" ) func getDataFilePaths() []pathReceiver { return []pathReceiver{ + func() (string, error) { + env := os.Getenv(cliDataFilePathEnvVar) + if env != "" { + return env, nil + } + return "", errors.New("env is empty") + }, receiverWithPath(os.UserConfigDir, zeropsDir, cliDataFileName), receiverWithPath(os.UserHomeDir, zeropsDir, cliDataFileName), } @@ -17,6 +26,13 @@ func getDataFilePaths() []pathReceiver { func getLogFilePath() []pathReceiver { return []pathReceiver{ + func() (string, error) { + env := os.Getenv(cliLogFilePathEnvVar) + if env != "" { + return env, nil + } + return "", errors.New("env is empty") + }, func() (string, error) { return path.Join("/var/log/", zeropsDir, zeropsLogFile), nil }, diff --git a/src/constants/windows.go b/src/constants/windows.go index 604f5299..ec8e705c 100644 --- a/src/constants/windows.go +++ b/src/constants/windows.go @@ -5,11 +5,22 @@ package constants import ( "os" - "path" + + "github.com/pkg/errors" ) +// this line is here to make linter happy +var _ = zeropsDir + func getDataFilePaths() []pathReceiver { return []pathReceiver{ + func() (string, error) { + env := os.Getenv(cliDataFilePathEnvVar) + if env != "" { + return env, nil + } + return "", errors.New("env is empty") + }, receiverWithPath(os.UserConfigDir, "Zerops", cliDataFileName), receiverWithPath(os.UserHomeDir, "Zerops", cliDataFileName), } @@ -18,7 +29,11 @@ func getDataFilePaths() []pathReceiver { func getLogFilePath() []pathReceiver { return []pathReceiver{ func() (string, error) { - return path.Join("/usr/local/var/log/", zeropsLogFile), nil + env := os.Getenv(cliLogFilePathEnvVar) + if env != "" { + return env, nil + } + return "", errors.New("env is empty") }, receiverWithPath(os.UserConfigDir, "Zerops", zeropsLogFile), receiverWithPath(os.UserHomeDir, "Zerops", zeropsLogFile), diff --git a/src/constants/zerops.go b/src/constants/zerops.go index 2820d8ab..990c11a9 100644 --- a/src/constants/zerops.go +++ b/src/constants/zerops.go @@ -51,7 +51,7 @@ func findFirstWritablePath(paths []pathReceiver) (string, error) { } } - // FIXME - janhajek translate + // TODO - janhajek translate return "", errors.Errorf("Unable to find writable path from %v", checkedPaths) } diff --git a/src/httpClient/handler.go b/src/httpClient/handler.go index bb946d64..51b9cc14 100644 --- a/src/httpClient/handler.go +++ b/src/httpClient/handler.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "io" - "io/ioutil" "net/http" "time" @@ -46,12 +45,6 @@ func ContentType(contentType string) Option { } } -func BearerAuthorization(token string) Option { - return func(cfg *optionConfig) { - cfg.headers["Authorization"] = "Bearer " + token - } -} - type optionConfig struct { headers map[string]string } @@ -103,7 +96,7 @@ func (h *Handler) doStream(method string, url string, body io.Reader, options .. } defer resp.Body.Close() - bodyBytes, err := ioutil.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return Response{}, err } diff --git a/src/logger/handler.go b/src/logger/handler.go index 0eab13a3..8df325c1 100644 --- a/src/logger/handler.go +++ b/src/logger/handler.go @@ -10,14 +10,7 @@ import ( "github.com/sirupsen/logrus" ) -type Config struct { - FilePath string - IsTerminal bool -} - type Handler struct { - config Config - logrus *logrus.Logger } diff --git a/src/serviceLogs/handler_checkInputValues.go b/src/serviceLogs/handler_checkInputValues.go index f706a394..6e2cd282 100644 --- a/src/serviceLogs/handler_checkInputValues.go +++ b/src/serviceLogs/handler_checkInputValues.go @@ -77,7 +77,7 @@ func (h *Handler) getMinSeverity(config RunConfig) (intVal int, err error) { return key, nil } } - intVal, err = strconv.Atoi(ms) + _, err = strconv.Atoi(ms) if err != nil { return 1, fmt.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityStringLimitErr)) } diff --git a/src/serviceLogs/handler_getLogs.go b/src/serviceLogs/handler_getLogs.go index 854b5b03..9eca8e97 100644 --- a/src/serviceLogs/handler_getLogs.go +++ b/src/serviceLogs/handler_getLogs.go @@ -3,7 +3,7 @@ package serviceLogs import ( "context" "encoding/json" - "io/ioutil" + "io" "net/http" "time" ) @@ -50,7 +50,7 @@ func getLogs(ctx context.Context, method, url, format, formatTemplate, mode stri defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { return err diff --git a/src/serviceLogs/handler_run.go b/src/serviceLogs/handler_run.go index 49530125..d91fe828 100644 --- a/src/serviceLogs/handler_run.go +++ b/src/serviceLogs/handler_run.go @@ -10,7 +10,7 @@ func (h *Handler) Run(ctx context.Context, config RunConfig) error { return err } - // FIXME - janhajek check empty containerID + // TODO - janhajek check empty containerID if err = h.printLogs(ctx, inputs, config.Project.ID, config.ServiceId, config.Container.ID); err != nil { return err } diff --git a/src/serviceLogs/handler_ws.go b/src/serviceLogs/handler_ws.go index a8fa1353..473a40da 100644 --- a/src/serviceLogs/handler_ws.go +++ b/src/serviceLogs/handler_ws.go @@ -26,10 +26,11 @@ func (h *Handler) getLogStream( interrupt := make(chan os.Signal, 1) // Channel to listen for interrupt signal to terminate gracefully signal.Notify(interrupt, os.Interrupt) // Notify the interrupt channel for SIGINT - conn, _, err := websocket.DefaultDialer.Dial(url, nil) + conn, reps, err := websocket.DefaultDialer.Dial(url, nil) if err != nil { return fmt.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) } + defer reps.Body.Close() defer conn.Close() done := make(chan interface{}) // Channel to indicate that the receiverHandler is done diff --git a/src/storage/handler.go b/src/storage/handler.go index a15466b8..7583c26a 100644 --- a/src/storage/handler.go +++ b/src/storage/handler.go @@ -13,9 +13,12 @@ type Config struct { } type Handler[T any] struct { + //nolint:structcheck // Why: `is unused` error is false positive config Config - data T - lock sync.RWMutex + //nolint:structcheck // Why: `is unused` error is false positive + data T + //nolint:structcheck // Why: `is unused` error is false positive + lock sync.RWMutex } func New[T any](config Config) (*Handler[T], error) { @@ -51,7 +54,7 @@ func (h *Handler[T]) load() error { } if err := json.NewDecoder(f).Decode(&h.data); err != nil { - // FIXME - janhajek translation + // TODO - janhajek translation return errors.WithMessagef(err, "Unable to decode json file %s", h.config.FilePath) } diff --git a/src/uxBlock/blocks.go b/src/uxBlock/blocks.go index fc4cca1c..9f9fb7a1 100644 --- a/src/uxBlock/blocks.go +++ b/src/uxBlock/blocks.go @@ -12,7 +12,7 @@ type UxBlocks struct { outputLogger logger.Logger debugFileLogger logger.Logger - // FIXME - janhajek comment + // TODO - janhajek comment ctxCancel context.CancelFunc } diff --git a/src/uxBlock/prompt.go b/src/uxBlock/prompt.go index 34c585eb..e88b05ad 100644 --- a/src/uxBlock/prompt.go +++ b/src/uxBlock/prompt.go @@ -9,8 +9,7 @@ import ( ) type promptConfig struct { - label string - header *TableRow + label string } type PromptOption = func(cfg *promptConfig) @@ -26,7 +25,7 @@ func (b *UxBlocks) Prompt( opt(&cfg) } - // FIXME - janhajek fix message + // TODO - janhajek fix message if !b.isTerminal { return 0, errors.New(cfg.label + ", you can choose only in terminal") } diff --git a/src/uxBlock/select.go b/src/uxBlock/select.go index 3f63c032..e4408696 100644 --- a/src/uxBlock/select.go +++ b/src/uxBlock/select.go @@ -43,7 +43,7 @@ func (b *UxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions opt(&cfg) } - // FIXME - janhajek fix message + // TODO - janhajek fix message if !b.isTerminal { return nil, errors.New(cfg.label + ", you can choose only in terminal") } diff --git a/src/uxBlock/spinner.go b/src/uxBlock/spinner.go index a2a3372a..63cee2e2 100644 --- a/src/uxBlock/spinner.go +++ b/src/uxBlock/spinner.go @@ -16,7 +16,7 @@ func (b *UxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOpti //if !b.isTerminal { // return func(success bool) { - // // FIXME - janhajek + // // TODO - janhajek // //if success { // // b.info(cfg.successMessage) // //} else { @@ -42,7 +42,7 @@ func (b *UxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOpti return func() { p.Send(spinnerEndCmd{}) p.Wait() - // FIXME - janhajek + // TODO - janhajek //if success { // b.info(cfg.successMessage) //} else { diff --git a/src/uxHelpers/project.go b/src/uxHelpers/project.go index eddd8003..1b7e4a22 100644 --- a/src/uxHelpers/project.go +++ b/src/uxHelpers/project.go @@ -66,7 +66,7 @@ func PrintProjectList( } func createProjectTableRows(projects []entity.Project) (*uxBlock.TableRow, *uxBlock.TableBody) { - // FIXME - janhajek translation + // TODO - janhajek translation header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Description", "Client ID", "Status") tableBody := &uxBlock.TableBody{} diff --git a/src/uxHelpers/service.go b/src/uxHelpers/service.go index 56b8069d..764bc0c5 100644 --- a/src/uxHelpers/service.go +++ b/src/uxHelpers/service.go @@ -69,7 +69,7 @@ func PrintServiceList( } func createServiceTableRows(projects []entity.Service) (*uxBlock.TableRow, *uxBlock.TableBody) { - // FIXME - janhajek translation + // TODO - janhajek translation header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Status") tableBody := &uxBlock.TableBody{} diff --git a/src/uxHelpers/spinner.go b/src/uxHelpers/spinner.go index 3fb0d110..ef41297a 100644 --- a/src/uxHelpers/spinner.go +++ b/src/uxHelpers/spinner.go @@ -20,7 +20,7 @@ func ProcessCheckWithSpinner( restApiClient *zeropsRestApiClient.Handler, processList []Process, ) error { - var spinners []*uxBlock.Spinner + spinners := make([]*uxBlock.Spinner, 0, len(processList)) for _, process := range processList { spinners = append(spinners, uxBlock.NewSpinner(process.RunningMessage)) } diff --git a/tools/install.sh b/tools/install.sh index 70dead43..e2f46a73 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -46,4 +46,4 @@ chmod +x bin/protoc rm -rf tmp # https://github.com/golangci/golangci-lint#go Please, do not installDaemon golangci-lint by go get -curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "$GOBIN" v1.45.2 +curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "$GOBIN" v1.55.2 From e904976af3d8a3714cba0f7434774413aeeb86e8 Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Wed, 31 Jan 2024 19:57:31 +0100 Subject: [PATCH 06/12] updates pt.2 --- Makefile | 11 + go.mod | 1 + go.sum | 5 + src/archiveClient/handler_findFilesByRules.go | 10 +- .../handler_findFilesByRules_test.go | 9 +- src/archiveClient/handler_tarFile.go | 7 +- src/cmd/bucketS3Delete.go | 15 +- src/cmd/bucketZeropsDelete.go | 15 +- src/cmd/login.go | 12 +- src/cmd/projectDelete.go | 19 +- src/cmd/projectImport.go | 37 +++- src/cmd/projectServiceImport.go | 4 +- src/cmd/projectStart.go | 3 +- src/cmd/projectStop.go | 3 +- src/cmd/serviceDelete.go | 19 +- src/cmd/serviceDeploy.go | 83 ++++--- src/cmd/servicePush.go | 88 +++++--- src/cmd/serviceStart.go | 3 +- src/cmd/serviceStop.go | 3 +- src/cmd/uxHelpers.go | 29 +-- src/cmdBuilder/cmdBuilderCreateRunFunc.go | 25 +-- src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 12 - src/cmdBuilder/dependencyTreeProject.go | 3 +- src/cmdBuilder/dependencyTreeService.go | 9 +- src/entity/org.go | 13 ++ src/entity/repository/org.go | 39 ++++ src/entity/repository/project.go | 21 +- src/entity/repository/service.go | 26 +-- src/i18n/en.go | 18 +- src/i18n/i18n.go | 14 +- src/uxBlock/blocks.go | 32 ++- src/uxBlock/logs.go | 18 +- src/uxBlock/mocks/blocks.go | 207 ++++++++++++++++++ src/uxBlock/prompt.go | 10 +- src/uxBlock/select.go | 9 +- src/uxBlock/showcase/main.go | 12 +- src/uxBlock/spinner.go | 27 +-- src/uxBlock/table.go | 2 +- src/uxHelpers/org.go | 66 ++++++ src/uxHelpers/project.go | 6 +- src/uxHelpers/service.go | 8 +- src/uxHelpers/spinner.go | 66 +++--- src/yamlReader/readYaml.go | 2 +- src/zeropsRestApiClient/errors.go | 68 ------ 44 files changed, 680 insertions(+), 409 deletions(-) create mode 100644 Makefile create mode 100644 src/entity/org.go create mode 100644 src/entity/repository/org.go create mode 100644 src/uxBlock/mocks/blocks.go create mode 100644 src/uxHelpers/org.go delete mode 100644 src/zeropsRestApiClient/errors.go diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..e469439f --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +## help show this help +.PHONY: help + +help: + @printf "possible values: test, lint" + +test: + go test -v ./cmd/... ./src/... + +lint: + gomodrun golangci-lint run ./cmd/... ./src/... --verbose \ No newline at end of file diff --git a/go.mod b/go.mod index 7af8ee56..895c7e70 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/golang/mock v1.4.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/go.sum b/go.sum index 1f98d9b1..a13aa168 100644 --- a/go.sum +++ b/go.sum @@ -86,6 +86,7 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU 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.3/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= @@ -288,6 +289,8 @@ 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.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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= @@ -452,6 +455,8 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= diff --git a/src/archiveClient/handler_findFilesByRules.go b/src/archiveClient/handler_findFilesByRules.go index 21f206e8..1aa1a0ef 100644 --- a/src/archiveClient/handler_findFilesByRules.go +++ b/src/archiveClient/handler_findFilesByRules.go @@ -2,21 +2,21 @@ package archiveClient import ( "errors" - "fmt" "os" "path/filepath" "strings" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" ) -func (h *Handler) FindFilesByRules(workingDir string, sources []string) ([]File, error) { +func (h *Handler) FindFilesByRules(uxBlocks uxBlock.UxBlocks, workingDir string, sources []string) ([]File, error) { workingDir, err := filepath.Abs(workingDir) if err != nil { return nil, err } - fmt.Printf(i18n.T(i18n.ArchClientWorkingDirectory)+"\n", workingDir) + uxBlocks.PrintLine(i18n.T(i18n.ArchClientWorkingDirectory, workingDir)) // resulting function returns File from provided path // if file shouldn't be included in the result, File.ArchivePath will be empty @@ -56,9 +56,9 @@ func (h *Handler) FindFilesByRules(workingDir string, sources []string) ([]File, if fileInfo.IsDir() { source = strings.TrimSuffix(source, string(os.PathSeparator)) + string(os.PathSeparator) - fmt.Printf(i18n.T(i18n.ArchClientPackingDirectory)+"\n", source) + uxBlocks.PrintLine(i18n.T(i18n.ArchClientPackingDirectory, source)) } else { - fmt.Printf(i18n.T(i18n.ArchClientPackingFile)+"\n", source) + uxBlocks.PrintLine(i18n.T(i18n.ArchClientPackingFile, source)) } trimPath, err := filepath.Abs(filepath.Join(workingDir, parts[0])) diff --git a/src/archiveClient/handler_findFilesByRules_test.go b/src/archiveClient/handler_findFilesByRules_test.go index 68f434bc..d56d5bd0 100644 --- a/src/archiveClient/handler_findFilesByRules_test.go +++ b/src/archiveClient/handler_findFilesByRules_test.go @@ -3,7 +3,9 @@ package archiveClient import ( "testing" + "github.com/golang/mock/gomock" . "github.com/onsi/gomega" + "github.com/zeropsio/zcli/src/uxBlock/mocks" ) var testErrorResponseDataProvider = []struct { @@ -219,14 +221,19 @@ var testErrorResponseDataProvider = []struct { } func TestValidation(t *testing.T) { + ctrl := gomock.NewController(t) + uxBlocks := mocks.NewMockUxBlocks(ctrl) + uxBlocks.EXPECT().PrintLine(gomock.Any()).AnyTimes() + for _, test := range testErrorResponseDataProvider { test := test // scope lint t.Run(test.name+" in "+test.workingDir, func(t *testing.T) { + RegisterTestingT(t) archiver := New(Config{}) - files, err := archiver.FindFilesByRules(test.workingDir, test.input) + files, err := archiver.FindFilesByRules(uxBlocks, test.workingDir, test.input) Expect(err).ShouldNot(HaveOccurred()) output := func() (res []string) { diff --git a/src/archiveClient/handler_tarFile.go b/src/archiveClient/handler_tarFile.go index 5309791f..7bd9f187 100644 --- a/src/archiveClient/handler_tarFile.go +++ b/src/archiveClient/handler_tarFile.go @@ -2,10 +2,11 @@ package archiveClient import ( "archive/tar" - "fmt" "io" "os" "strings" + + "github.com/pkg/errors" ) func tarFile(archive *tar.Writer, file File, info os.FileInfo) error { @@ -48,11 +49,11 @@ func tarFile(archive *tar.Writer, file File, info os.FileInfo) error { return cpErr } if n != info.Size() { - return fmt.Errorf("wrote %d, want %d", n, info.Size()) + return errors.Errorf("wrote %d, want %d", n, info.Size()) } default: // let user know instead of silently ignoring unsupported files - return fmt.Errorf("unsupported file type: %s", header.Name) + return errors.Errorf("unsupported file type: %s", header.Name) } return nil diff --git a/src/cmd/bucketS3Delete.go b/src/cmd/bucketS3Delete.go index fd472e54..eb62da3b 100644 --- a/src/cmd/bucketS3Delete.go +++ b/src/cmd/bucketS3Delete.go @@ -22,6 +22,7 @@ func bucketS3DeleteCmd() *cmdBuilder.Cmd { Arg("bucketName"). StringFlag(accessKeyIdName, "", i18n.T(i18n.BucketS3AccessKeyId)). StringFlag(secretAccessKeyName, "", i18n.T(i18n.BucketS3SecretAccessKey)). + BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks @@ -36,15 +37,11 @@ func bucketS3DeleteCmd() *cmdBuilder.Cmd { bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), cmdData.Args["bucketName"][0]) - confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) - if err != nil { - return err - } - - if !confirm { - // TODO - janhajek message - fmt.Println("you have to confirm it") - return nil + if !cmdData.Params.GetBool("confirm") { + err = YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) + if err != nil { + return err + } } uxBlocks.PrintLine(i18n.T(i18n.BucketDeleteDeletingDirect, bucketName)) diff --git a/src/cmd/bucketZeropsDelete.go b/src/cmd/bucketZeropsDelete.go index 560d92a8..50c7a6fc 100644 --- a/src/cmd/bucketZeropsDelete.go +++ b/src/cmd/bucketZeropsDelete.go @@ -19,6 +19,7 @@ func bucketZeropsDeleteCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdBucketDelete)). ScopeLevel(cmdBuilder.Service). Arg("bucketName"). + BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks @@ -30,15 +31,11 @@ func bucketZeropsDeleteCmd() *cmdBuilder.Cmd { // TODO - janhajek duplicate bucketName := fmt.Sprintf("%s.%s", strings.ToLower(serviceId.Native()), cmdData.Args["bucketName"][0]) - confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) - if err != nil { - return err - } - - if !confirm { - // TODO - janhajek message - fmt.Println("you have to confirm it") - return nil + if !cmdData.Params.GetBool("confirm") { + err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) + if err != nil { + return err + } } uxBlocks.PrintLine(i18n.T(i18n.BucketDeleteDeletingZeropsApi, bucketName)) diff --git a/src/cmd/login.go b/src/cmd/login.go index d3a7c9dc..a6027278 100644 --- a/src/cmd/login.go +++ b/src/cmd/login.go @@ -8,13 +8,11 @@ import ( "github.com/zeropsio/zcli/src/cliStorage" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/constants" - "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/region" "github.com/zeropsio/zcli/src/uxBlock" "github.com/zeropsio/zcli/src/zeropsRestApiClient" - "github.com/zeropsio/zerops-go/errorCode" ) func loginCmd() *cmdBuilder.Cmd { @@ -48,13 +46,7 @@ func loginCmd() *cmdBuilder.Cmd { output, err := response.Output() if err != nil { - return zeropsRestApiClient.CheckError( - err, - zeropsRestApiClient.CheckErrorCode( - errorCode.NotAuthorized, - errorsx.NewUserError(i18n.T(i18n.LoginIncorrectToken), err), - ), - ) + return err } _, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data { @@ -74,7 +66,7 @@ func loginCmd() *cmdBuilder.Cmd { func getLoginRegion( ctx context.Context, - uxBlocks *uxBlock.UxBlocks, + uxBlocks uxBlock.UxBlocks, regions []region.Data, selectedRegion string, ) (region.Data, error) { diff --git a/src/cmd/projectDelete.go b/src/cmd/projectDelete.go index 8c06e59b..8e41089d 100644 --- a/src/cmd/projectDelete.go +++ b/src/cmd/projectDelete.go @@ -2,7 +2,6 @@ package cmd import ( "context" - "fmt" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/uxHelpers" @@ -17,16 +16,13 @@ func projectDeleteCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdProjectDelete)). ScopeLevel(cmdBuilder.Project). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { - confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ProjectDeleteConfirm, cmdData.Project.Name)) - if err != nil { - return err - } - - if !confirm { - // TODO - janhajek message - fmt.Println("you have to confirm it") - return nil + if !cmdData.Params.GetBool("confirm") { + err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ProjectDeleteConfirm, cmdData.Project.Name)) + if err != nil { + return err + } } deleteProjectResponse, err := cmdData.RestApiClient.DeleteProject( @@ -49,9 +45,8 @@ func projectDeleteCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: processId, + F: uxHelpers.CheckZeropsProcess(processId, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.ProjectDeleting), ErrorMessageMessage: i18n.T(i18n.ProjectDeleting), SuccessMessage: i18n.T(i18n.ProjectDeleted), diff --git a/src/cmd/projectImport.go b/src/cmd/projectImport.go index 03def1e3..f5f59690 100644 --- a/src/cmd/projectImport.go +++ b/src/cmd/projectImport.go @@ -4,6 +4,7 @@ import ( "context" "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zcli/src/yamlReader" @@ -20,14 +21,35 @@ func projectImportCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdProjectImport)). Long(i18n.T(i18n.CmdProjectImportLong)). Arg(projectImportArgName). + StringFlag("orgId", "", i18n.T(i18n.OrgIdFlag)). + StringFlag("workingDie", "./", i18n.T(i18n.BuildWorkingDir)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks - // TODO - janhajek client via flag - // TODO - janhajek interactive selector of clients + orgId := uuid.ClientId(cmdData.Params.GetString("orgId")) + if orgId == "" { + orgs, err := repository.GetAllOrgs(ctx, cmdData.RestApiClient) + if err != nil { + return err + } + + if len(orgs) == 1 { + orgId = orgs[0].ID + } else { + selectedOrg, err := uxHelpers.PrintOrgSelector(ctx, uxBlocks, cmdData.RestApiClient) + if err != nil { + return err + } + + orgId = selectedOrg.ID + } + } - // TODO - janhajek config - yamlContent, err := yamlReader.ReadContent(uxBlocks, cmdData.Args[projectImportArgName][0], "./") + yamlContent, err := yamlReader.ReadContent( + uxBlocks, + cmdData.Args[projectImportArgName][0], + cmdData.Params.GetString("workingDir"), + ) if err != nil { return err } @@ -35,8 +57,7 @@ func projectImportCmd() *cmdBuilder.Cmd { importProjectResponse, err := cmdData.RestApiClient.PostProjectImport( ctx, body.ProjectImport{ - // TODO - janhajek client id - ClientId: uuid.ClientId(cmdData.Args[projectImportArgName][0]), + ClientId: orgId, Yaml: types.Text(yamlContent), }, ) @@ -53,7 +74,7 @@ func projectImportCmd() *cmdBuilder.Cmd { for _, service := range responseOutput.ServiceStacks { for _, process := range service.Processes { processes = append(processes, uxHelpers.Process{ - Id: process.Id, + F: uxHelpers.CheckZeropsProcess(process.Id, cmdData.RestApiClient), RunningMessage: service.Name.String() + ": " + process.ActionName.String(), ErrorMessageMessage: service.Name.String() + ": " + process.ActionName.String(), SuccessMessage: service.Name.String() + ": " + process.ActionName.String(), @@ -65,7 +86,7 @@ func projectImportCmd() *cmdBuilder.Cmd { uxBlocks.PrintLine(i18n.T(i18n.QueuedProcesses, len(processes))) uxBlocks.PrintLine(i18n.T(i18n.CoreServices)) - err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, cmdData.RestApiClient, processes) + err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, processes) if err != nil { return err } diff --git a/src/cmd/projectServiceImport.go b/src/cmd/projectServiceImport.go index cb1d7dc2..a916d25f 100644 --- a/src/cmd/projectServiceImport.go +++ b/src/cmd/projectServiceImport.go @@ -47,7 +47,7 @@ func projectServiceImportCmd() *cmdBuilder.Cmd { for _, service := range responseOutput.ServiceStacks { for _, process := range service.Processes { processes = append(processes, uxHelpers.Process{ - Id: process.Id, + F: uxHelpers.CheckZeropsProcess(process.Id, cmdData.RestApiClient), RunningMessage: service.Name.String() + ": " + process.ActionName.String(), ErrorMessageMessage: service.Name.String() + ": " + process.ActionName.String(), SuccessMessage: service.Name.String() + ": " + process.ActionName.String(), @@ -58,7 +58,7 @@ func projectServiceImportCmd() *cmdBuilder.Cmd { uxBlocks.PrintLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks))) uxBlocks.PrintLine(i18n.T(i18n.QueuedProcesses, len(processes))) - err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, cmdData.RestApiClient, processes) + err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, processes) if err != nil { return err } diff --git a/src/cmd/projectStart.go b/src/cmd/projectStart.go index 546fcdf5..1fb196dc 100644 --- a/src/cmd/projectStart.go +++ b/src/cmd/projectStart.go @@ -36,9 +36,8 @@ func projectStartCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: processId, + F: uxHelpers.CheckZeropsProcess(processId, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.ProjectStarting), ErrorMessageMessage: i18n.T(i18n.ProjectStarting), SuccessMessage: i18n.T(i18n.ProjectStarted), diff --git a/src/cmd/projectStop.go b/src/cmd/projectStop.go index 086de9ae..8aeb7ef2 100644 --- a/src/cmd/projectStop.go +++ b/src/cmd/projectStop.go @@ -37,9 +37,8 @@ func projectStopCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: processId, + F: uxHelpers.CheckZeropsProcess(processId, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.ProjectStopping), ErrorMessageMessage: i18n.T(i18n.ProjectStopping), SuccessMessage: i18n.T(i18n.ProjectStopped), diff --git a/src/cmd/serviceDelete.go b/src/cmd/serviceDelete.go index f1357892..a09e45b7 100644 --- a/src/cmd/serviceDelete.go +++ b/src/cmd/serviceDelete.go @@ -2,7 +2,6 @@ package cmd import ( "context" - "fmt" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" @@ -16,16 +15,13 @@ func serviceDeleteCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceDelete)). ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). + BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { - confirm, err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ServiceDeleteConfirm, cmdData.Service.Name)) - if err != nil { - return err - } - - if !confirm { - // TODO - janhajek message - fmt.Println("you have to confirm it") - return nil + if !cmdData.Params.GetBool("confirm") { + err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ServiceDeleteConfirm, cmdData.Service.Name)) + if err != nil { + return err + } } deleteServiceResponse, err := cmdData.RestApiClient.DeleteServiceStack( @@ -48,9 +44,8 @@ func serviceDeleteCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: processId, + F: uxHelpers.CheckZeropsProcess(processId, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.ServiceDeleting), ErrorMessageMessage: i18n.T(i18n.ServiceDeleting), SuccessMessage: i18n.T(i18n.ServiceDeleted), diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go index f1b7a0c7..1e470713 100644 --- a/src/cmd/serviceDeploy.go +++ b/src/cmd/serviceDeploy.go @@ -57,21 +57,33 @@ func serviceDeployCmd() *cmdBuilder.Cmd { uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart)) - files, err := arch.FindFilesByRules(cmdData.Params.GetString("workingDir"), cmdData.Args["pathToFileOrDir"]) + files, err := arch.FindFilesByRules( + uxBlocks, + cmdData.Params.GetString("workingDir"), + cmdData.Args["pathToFileOrDir"], + ) if err != nil { return err } - reader, writer := io.Pipe() - defer reader.Close() + var reader io.Reader + pipeReader, writer := io.Pipe() + defer pipeReader.Close() + reader = pipeReader tarErrChan := make(chan error, 1) go arch.TarFiles(writer, files, tarErrChan) - r, err := savePackage(cmdData.Params.GetString("archiveFilePath"), reader) - if err != nil { - return err + if cmdData.Params.GetString("archiveFilePath") != "" { + packageFile, err := openPackageFile( + cmdData.Params.GetString("archiveFilePath"), + cmdData.Params.GetString("workingDir"), + ) + if err != nil { + return err + } + reader = io.TeeReader(reader, packageFile) } appVersion, err := createAppVersion( @@ -89,25 +101,37 @@ func serviceDeployCmd() *cmdBuilder.Cmd { HttpTimeout: time.Minute * 15, }) - // TODO - janhajek spinner? - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageStart)) - if err := packageUpload(httpClient, appVersion.UploadUrl.String(), r); err != nil { - // if an error occurred while packing the app, return that error - select { - case err := <-tarErrChan: - return err - default: - return err - } - } - - // wait for packing and saving to finish (should already be done after the package upload has finished) - if tarErr := <-tarErrChan; tarErr != nil { - return tarErr + err = uxHelpers.ProcessCheckWithSpinner( + ctx, + cmdData.UxBlocks, + []uxHelpers.Process{{ + F: func(ctx context.Context) error { + if err := packageUpload(httpClient, appVersion.UploadUrl.String(), reader); err != nil { + // if an error occurred while packing the app, return that error + select { + case err := <-tarErrChan: + return err + default: + return err + } + } + + // wait for packing and saving to finish (should already be done after the package upload has finished) + if tarErr := <-tarErrChan; tarErr != nil { + return tarErr + } + + return nil + }, + RunningMessage: i18n.T(i18n.BuildDeployUploadingPackageStart), + ErrorMessageMessage: i18n.T(i18n.BuildDeployUploadPackageFailed), + SuccessMessage: i18n.T(i18n.BuildDeployUploadingPackageDone), + }}, + ) + if err != nil { + return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageDone)) - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployDeployingStart)) deployResponse, err := cmdData.RestApiClient.PutAppVersionDeploy( @@ -131,14 +155,14 @@ func serviceDeployCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: deployProcess.Id, + F: uxHelpers.CheckZeropsProcess(deployProcess.Id, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.PushRunning), ErrorMessageMessage: i18n.T(i18n.PushRunning), SuccessMessage: i18n.T(i18n.PushFinished), }}, ) + if err != nil { return err } @@ -147,7 +171,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { }) } -func getValidConfigContent(uxBlocks *uxBlock.UxBlocks, workingDir string, zeropsYamlPath string) ([]byte, error) { +func getValidConfigContent(uxBlocks uxBlock.UxBlocks, workingDir string, zeropsYamlPath string) ([]byte, error) { workingDir, err := filepath.Abs(workingDir) if err != nil { return nil, err @@ -162,11 +186,9 @@ func getValidConfigContent(uxBlocks *uxBlock.UxBlocks, workingDir string, zerops zeropsYamlStat, err := os.Stat(zeropsYamlPath) if err != nil { if os.IsNotExist(err) { - if zeropsYamlPath != "" { - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound)) - } + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound, zeropsYamlPath)) } - return nil, nil + return nil, err } uxBlocks.PrintLine(i18n.T(i18n.BuildDeployZeropsYamlFound, zeropsYamlPath)) @@ -192,7 +214,6 @@ func validateZeropsYamlContent( service *entity.Service, yamlContent []byte, ) error { - resp, err := restApiClient.PostServiceStackZeropsYamlValidation(ctx, body.ZeropsYamlValidation{ Name: service.Name, ServiceStackTypeId: service.ServiceTypeId, diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go index fef91438..26ef3803 100644 --- a/src/cmd/servicePush.go +++ b/src/cmd/servicePush.go @@ -56,16 +56,24 @@ func servicePushCmd() *cmdBuilder.Cmd { return err } - reader, writer := io.Pipe() - defer reader.Close() + var reader io.Reader + pipeReader, writer := io.Pipe() + defer pipeReader.Close() + reader = pipeReader tarErrChan := make(chan error, 1) go arch.TarFiles(writer, files, tarErrChan) - r, err := savePackage(cmdData.Params.GetString("archiveFilePath"), reader) - if err != nil { - return err + if cmdData.Params.GetString("archiveFilePath") != "" { + packageFile, err := openPackageFile( + cmdData.Params.GetString("archiveFilePath"), + cmdData.Params.GetString("workingDir"), + ) + if err != nil { + return err + } + reader = io.TeeReader(reader, packageFile) } appVersion, err := createAppVersion( @@ -79,29 +87,41 @@ func servicePushCmd() *cmdBuilder.Cmd { } // TODO - janhajek merge with sdk client - HttpClient := httpClient.New(ctx, httpClient.Config{ + httpClient := httpClient.New(ctx, httpClient.Config{ HttpTimeout: time.Minute * 15, }) - // TODO - janhajek spinner? - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageStart)) - if err := packageUpload(HttpClient, appVersion.UploadUrl.String(), r); err != nil { - // if an error occurred while packing the app, return that error - select { - case err := <-tarErrChan: - return err - default: - return err - } - } - - // wait for packing and saving to finish (should already be done after the package upload has finished) - if tarErr := <-tarErrChan; tarErr != nil { - return tarErr + err = uxHelpers.ProcessCheckWithSpinner( + ctx, + cmdData.UxBlocks, + []uxHelpers.Process{{ + F: func(ctx context.Context) error { + if err := packageUpload(httpClient, appVersion.UploadUrl.String(), reader); err != nil { + // if an error occurred while packing the app, return that error + select { + case err := <-tarErrChan: + return err + default: + return err + } + } + + // wait for packing and saving to finish (should already be done after the package upload has finished) + if tarErr := <-tarErrChan; tarErr != nil { + return tarErr + } + + return nil + }, + RunningMessage: i18n.T(i18n.BuildDeployUploadingPackageStart), + ErrorMessageMessage: i18n.T(i18n.BuildDeployUploadPackageFailed), + SuccessMessage: i18n.T(i18n.BuildDeployUploadingPackageDone), + }}, + ) + if err != nil { + return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployUploadingPackageDone)) - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageDone)) if cmdData.Params.GetString("archiveFilePath") != "" { @@ -136,9 +156,8 @@ func servicePushCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: deployProcess.Id, + F: uxHelpers.CheckZeropsProcess(deployProcess.Id, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.PushRunning), ErrorMessageMessage: i18n.T(i18n.PushRunning), SuccessMessage: i18n.T(i18n.PushFinished), @@ -181,31 +200,34 @@ func createAppVersion( return appVersion, nil } -func savePackage(archiveFilePath string, reader io.Reader) (io.Reader, error) { - if archiveFilePath == "" { - return reader, nil +func openPackageFile(archiveFilePath string, workingDir string) (*os.File, error) { + workingDir, err := filepath.Abs(workingDir) + if err != nil { + return nil, err } + archiveFilePath = filepath.Join(workingDir, archiveFilePath) + filePath, err := filepath.Abs(archiveFilePath) if err != nil { - return reader, err + return nil, err } // check if the target file exists _, err = os.Stat(filePath) if err != nil && !os.IsNotExist(err) { - return reader, err + return nil, err } if err == nil { - return reader, errors.Errorf(i18n.T(i18n.ArchClientFileAlreadyExists), archiveFilePath) + return nil, errors.Errorf(i18n.T(i18n.ArchClientFileAlreadyExists), archiveFilePath) } file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0660) if err != nil { - return reader, err + return nil, err } - return io.TeeReader(reader, file), nil + return file, nil } func packageUpload(client *httpClient.Handler, uploadUrl string, reader io.Reader) error { diff --git a/src/cmd/serviceStart.go b/src/cmd/serviceStart.go index 0562e2f5..bbf79b9c 100644 --- a/src/cmd/serviceStart.go +++ b/src/cmd/serviceStart.go @@ -36,9 +36,8 @@ func serviceStartCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: processId, + F: uxHelpers.CheckZeropsProcess(processId, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.ServiceStarting), ErrorMessageMessage: i18n.T(i18n.ServiceStarting), SuccessMessage: i18n.T(i18n.ServiceStarted), diff --git a/src/cmd/serviceStop.go b/src/cmd/serviceStop.go index fd8cd272..f7d65e2e 100644 --- a/src/cmd/serviceStop.go +++ b/src/cmd/serviceStop.go @@ -37,9 +37,8 @@ func serviceStopCmd() *cmdBuilder.Cmd { err = uxHelpers.ProcessCheckWithSpinner( ctx, cmdData.UxBlocks, - cmdData.RestApiClient, []uxHelpers.Process{{ - Id: processId, + F: uxHelpers.CheckZeropsProcess(processId, cmdData.RestApiClient), RunningMessage: i18n.T(i18n.ServiceStopping), ErrorMessageMessage: i18n.T(i18n.ServiceStopping), SuccessMessage: i18n.T(i18n.ServiceStopped), diff --git a/src/cmd/uxHelpers.go b/src/cmd/uxHelpers.go index 4fb3429c..9b5e9888 100644 --- a/src/cmd/uxHelpers.go +++ b/src/cmd/uxHelpers.go @@ -3,35 +3,22 @@ package cmd import ( "context" + "github.com/pkg/errors" "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" ) -func YesNoPromptDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData, message string) (bool, error) { - if cmdData.QuietMode == cmdBuilder.QuietModeConfirmNothing { - return true, nil - } - +func YesNoPromptDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData, message string) error { // TODO - janhajek translate - choices := []string{"no", "yes"} + choices := []string{"NO", "YES"} choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) if err != nil { - return false, err + return err } - return choice == 1, nil -} - -func YesNoPromptNonDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData, message string) (bool, error) { - if cmdData.QuietMode == cmdBuilder.QuietModeConfirmNothing || cmdData.QuietMode == cmdBuilder.QuietModeConfirmOnlyDestructive { - return true, nil - } - - // TODO - janhajek translate - choices := []string{"no", "yes"} - choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) - if err != nil { - return false, err + if choice == 0 { + return errors.New(i18n.T(i18n.DestructiveOperationConfirmationFailed)) } - return choice == 1, nil + return nil } diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index a161e3b3..bfa57258 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -57,8 +57,7 @@ func (r *CmdParamReader) GetBool(name string) bool { type GuestCmdData struct { CliStorage *cliStorage.Handler - UxBlocks *uxBlock.UxBlocks - QuietMode QuietMode + UxBlocks uxBlock.UxBlocks Args map[string][]string Params ParamsReader } @@ -106,11 +105,6 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co return err } - quietMode, err := getQuietMode(isTerminal) - if err != nil { - return err - } - cliStorage, err := createCliStorage() if err != nil { return err @@ -124,7 +118,6 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co guestCmdData := &GuestCmdData{ CliStorage: cliStorage, UxBlocks: uxBlocks, - QuietMode: quietMode, Args: argsMap, Params: newCmdParamReader(cobraCmd, params), } @@ -199,7 +192,7 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { return argsMap, nil } -func printError(err error, uxBlocks *uxBlock.UxBlocks) { +func printError(err error, uxBlocks uxBlock.UxBlocks) { uxBlocks.PrintDebugLine(fmt.Sprintf("error: %+v", err)) if userErr := errorsx.AsUserError(err); userErr != nil { @@ -224,20 +217,6 @@ func printError(err error, uxBlocks *uxBlock.UxBlocks) { uxBlocks.PrintErrorLine(err.Error()) } -func getQuietMode(isTerminal bool) (QuietMode, error) { - if !isTerminal { - return QuietModeConfirmNothing, nil - } - - switch QuietMode(QuietModeFlag) { - case QuietModeConfirmNothing, QuietModeConfirmAll, QuietModeConfirmOnlyDestructive: - return QuietMode(QuietModeFlag), nil - default: - // TODO - janhajek message - return 0, errors.New("unknown quiet mode") - } -} - func isTerminal() (bool, error) { switch TerminalMode(TerminalFlag) { case TerminalModeAuto: diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go index 1db123f2..94718841 100644 --- a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -9,16 +9,6 @@ import ( "github.com/zeropsio/zcli/src/params" ) -type QuietMode int - -const ( - QuietModeConfirmAll QuietMode = iota - QuietModeConfirmOnlyDestructive - QuietModeConfirmNothing -) - -var QuietModeFlag int - type TerminalMode string const ( @@ -73,8 +63,6 @@ func createRootCommand() *cobra.Command { // TODO - janhajek add a dynamic help for subcommands rootCmd.Flags().BoolP("help", "h", false, i18n.T(i18n.DisplayHelp)+i18n.T(i18n.GroupHelp)) - - rootCmd.PersistentFlags().IntVar(&QuietModeFlag, "quiet", int(QuietModeConfirmAll), i18n.T(i18n.QuietModeFlag)) rootCmd.PersistentFlags().StringVar(&TerminalFlag, "terminal", "auto", i18n.T(i18n.TerminalFlag)) return rootCmd diff --git a/src/cmdBuilder/dependencyTreeProject.go b/src/cmdBuilder/dependencyTreeProject.go index defaecdf..43f6eab2 100644 --- a/src/cmdBuilder/dependencyTreeProject.go +++ b/src/cmdBuilder/dependencyTreeProject.go @@ -18,8 +18,7 @@ type project struct { const ProjectArgName = "projectId" func (p *project) AddCommandFlags(cmd *Cmd) { - // TODO - janhajek translation - cmd.StringFlag(ProjectArgName, "", "Project id") + cmd.StringFlag(ProjectArgName, "", i18n.T(i18n.ProjectIdFlag)) } func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error { diff --git a/src/cmdBuilder/dependencyTreeService.go b/src/cmdBuilder/dependencyTreeService.go index 1d5c82ba..7d5083d0 100644 --- a/src/cmdBuilder/dependencyTreeService.go +++ b/src/cmdBuilder/dependencyTreeService.go @@ -15,14 +15,13 @@ type service struct { } const ServiceArgName = "serviceIdOrName" -const ServiceFlagName = "serviceId" +const serviceFlagName = "serviceId" func (s *service) AddCommandFlags(cmd *Cmd) { - // TODO - janhajek translation - cmd.StringFlag(ServiceFlagName, "", "Service id") + cmd.StringFlag(serviceFlagName, "", i18n.T(i18n.ServiceIdFlag)) } -func (s *service) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error { +func (s *service) LoadSelectedScope(ctx context.Context, _ *Cmd, cmdData *LoggedUserCmdData) error { infoText := i18n.SelectedService var service *entity.Service var err error @@ -35,7 +34,7 @@ func (s *service) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *Logg } // service id is passed as a flag - if serviceId := cmdData.Params.GetString(ServiceFlagName); serviceId != "" { + if serviceId := cmdData.Params.GetString(serviceFlagName); serviceId != "" { service, err = repository.GetServiceById( ctx, cmdData.RestApiClient, diff --git a/src/entity/org.go b/src/entity/org.go new file mode 100644 index 00000000..279362b7 --- /dev/null +++ b/src/entity/org.go @@ -0,0 +1,13 @@ +package entity + +import ( + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/enum" + "github.com/zeropsio/zerops-go/types/uuid" +) + +type Org struct { + ID uuid.ClientId + Role enum.ClientUserLightRoleCodeEnum + Name types.String +} diff --git a/src/entity/repository/org.go b/src/entity/repository/org.go new file mode 100644 index 00000000..5954c9fb --- /dev/null +++ b/src/entity/repository/org.go @@ -0,0 +1,39 @@ +package repository + +import ( + "context" + + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/output" +) + +func GetAllOrgs( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, +) ([]entity.Org, error) { + response, err := restApiClient.GetUserInfo(ctx) + if err != nil { + return nil, err + } + + resOutput, err := response.Output() + if err != nil { + return nil, err + } + + orgs := make([]entity.Org, 0, len(resOutput.ClientUserList)) + for _, client := range resOutput.ClientUserList { + orgs = append(orgs, orgFromEsSearch(client)) + } + + return orgs, nil +} + +func orgFromEsSearch(esClientUser output.ClientUserExtra) entity.Org { + return entity.Org{ + ID: esClientUser.ClientId, + Name: esClientUser.Client.AccountName, + Role: esClientUser.RoleCode, + } +} diff --git a/src/entity/repository/project.go b/src/entity/repository/project.go index 0d2b4ff4..a20563cd 100644 --- a/src/entity/repository/project.go +++ b/src/entity/repository/project.go @@ -4,12 +4,9 @@ import ( "context" "github.com/zeropsio/zcli/src/entity" - "github.com/zeropsio/zcli/src/errorsx" - "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/dto/input/path" "github.com/zeropsio/zerops-go/dto/output" - "github.com/zeropsio/zerops-go/errorCode" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -25,17 +22,7 @@ func GetProjectById( projectOutput, err := projectResponse.Output() if err != nil { - return nil, zeropsRestApiClient.CheckError( - err, - zeropsRestApiClient.CheckInvalidUserInput( - "id", - errorsx.NewUserError(i18n.T(i18n.ProjectIdInvalidFormat), err), - ), - zeropsRestApiClient.CheckErrorCode( - errorCode.ProjectNotFound, - errorsx.NewUserError(i18n.T(i18n.ProjectNotFound, projectId), err), - ), - ) + return nil, err } project := projectFromApiOutput(projectOutput) @@ -51,14 +38,14 @@ func GetAllProjects( return nil, err } - i, err := info.Output() + output, err := info.Output() if err != nil { return nil, err } var projects []entity.Project - for _, b := range i.ClientUserList { - response, err := restApiClient.GetProjectsByClient(ctx, b.ClientId) + for _, clientUser := range output.ClientUserList { + response, err := restApiClient.GetProjectsByClient(ctx, clientUser.ClientId) if err != nil { return nil, err } diff --git a/src/entity/repository/service.go b/src/entity/repository/service.go index 158b001f..fb61ecd7 100644 --- a/src/entity/repository/service.go +++ b/src/entity/repository/service.go @@ -5,11 +5,9 @@ import ( "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/errorsx" - "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/dto/input/path" "github.com/zeropsio/zerops-go/dto/output" - "github.com/zeropsio/zerops-go/errorCode" "github.com/zeropsio/zerops-go/types" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -45,17 +43,7 @@ func GetServiceById( serviceOutput, err := serviceResponse.Output() if err != nil { - return nil, zeropsRestApiClient.CheckError( - err, - zeropsRestApiClient.CheckInvalidUserInput( - "id", - errorsx.NewUserError(i18n.T(i18n.ServiceIdInvalidFormat), err), - ), - zeropsRestApiClient.CheckErrorCode( - errorCode.ServiceStackNotFound, - errorsx.NewUserError(i18n.T(i18n.ServiceNotFound, serviceId), err), - ), - ) + return nil, err } service := serviceFromApiOutput(serviceOutput) @@ -78,17 +66,7 @@ func GetServiceByName( serviceOutput, err := serviceResponse.Output() if err != nil { - return nil, zeropsRestApiClient.CheckError( - err, - zeropsRestApiClient.CheckInvalidUserInput( - "id", - errorsx.NewUserError(i18n.T(i18n.ServiceIdInvalidFormat), err), - ), - zeropsRestApiClient.CheckErrorCode( - errorCode.ServiceStackNotFound, - errorsx.NewUserError(i18n.T(i18n.ServiceNotFound, serviceName), err), - ), - ) + return nil, err } service := serviceFromApiOutput(serviceOutput) diff --git a/src/i18n/en.go b/src/i18n/en.go index 1765756f..3b96d7c2 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -76,7 +76,7 @@ var en = map[string]string{ BuildArchiveFilePath: "If set, zCLI creates a tar.gz archive with the application code in the required path relative\nto the working directory. By default, no archive is created.", ZeropsYamlLocation: "Sets a custom path to the zerops.yml file relative to the working directory. By default zCLI\nlooks for zerops.yml in the working directory.", UploadGitFolder: "If set, zCLI the .git folder is also uploaded. By default, the .git folder is ignored.", - ClientId: "If you have access to more than one client, you must specify the client ID for which the\nproject is to be created.", + OrgIdFlag: "If you have access to more than one organization, you must specify the org ID for which the\nproject is to be created.", LogLimitFlag: "How many of the most recent log messages will be returned. Allowed interval is <1;1000>.\nDefault value = 100.", LogMinSeverityFlag: "Returns log messages with requested or higher severity. Set either severity number in the interval\n<0;7> or one of following severity codes:\nEMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFORMATIONAL, DEBUG.", LogMsgTypeFlag: "Select either APPLICATION or WEBSERVER log messages to be returned. Default value = APPLICATION.", @@ -87,6 +87,9 @@ var en = map[string]string{ QuietModeFlag: "In terminal mode some operations need to be confirmed. 0 = Everything needs to be confirmed, 1 = Non-destructive operations need to be confirmed, 2 = Quiet mode, nothing needs to be confirmed. Default value is 0.", TerminalFlag: "If enabled provides a rich UI to communicate with a user. Possible values: auto, enabled, disabled. Default value is auto.", LogFilePathFlag: "Path to a log file. Default value: %s.", + ConfirmFlag: "If set, zCLI will not ask for confirmation of destructive operations.", + ServiceIdFlag: "If you have access to more than one service, you must specify the service ID for which the\ncommand is to be executed.", + ProjectIdFlag: "If you have access to more than one project, you must specify the project ID for which the\ncommand is to be executed.", // prompt PromptEnterZeropsServiceName: "Enter hostname of zerops service", @@ -196,7 +199,7 @@ var en = map[string]string{ BuildDeployZeropsYamlEmpty: "config file zerops.yml is empty", BuildDeployZeropsYamlTooLarge: "max. size of zerops.yml is 10 KB", BuildDeployZeropsYamlFound: "File zerops.yml found. Path: %s.", - BuildDeployZeropsYamlNotFound: "File zerops.yml not found", + BuildDeployZeropsYamlNotFound: "File zerops.yml not found. Expected path: %s.", // S3 BucketGenericXAmzAcl: "Defines one of predefined grants, known as canned ACLs.\nValid values are: private, public-read, public-read-write, authenticated-read.", @@ -241,17 +244,20 @@ more info: https://docs.zerops.io/documentation/cli/authorization.html`, ServiceSelectorListEmpty: "Project doesn't have any services yet. Create a new service using `zcli service import` command", ServiceSelectorPrompt: "Please, select a service", ServiceSelectorOutOfRangeError: "We couldn't find a service with the index you entered. Please, try again or contact our support team.", + OrgSelectorListEmpty: "You don't belong to any organization yet. Please, contact our support team.", + OrgSelectorPrompt: "Please, select an org", + OrgSelectorOutOfRangeError: "We couldn't find an org with the index you entered. Please, try again or contact our support team.", + SelectorAllowedOnlyInTerminal: "Interactive selection can be used only in terminal mode. Use command flags to specify missing parameters.", + PromptAllowedOnlyInTerminal: "Interactive prompt can be used only in terminal mode. Use --confirm=true flag to confirm it", // Global SelectedProject: "Selected project: %s", SelectedService: "Selected service: %s", ScopedProject: "Scoped project: %s", ScopedProjectNotFound: "Scoped project wasn't found, Select a different project using `zcli scope project` command.", - ScopedServiceNotFound: "Scoped service wasn't found, Select a different service using `zcli scope service` command.", - - ProjectIdInvalidFormat: "Invalid format of project ID. ID must have 22 characters.", - ProjectNotFound: "Project [%s] wasn't found", ServiceIdInvalidFormat: "Invalid format of service ID. ID must have 22 characters.", ServiceNotFound: "Service [%s] wasn't found", + + DestructiveOperationConfirmationFailed: "You have to confirm a destructive operation.", } diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index 3a9a75ad..a5cc24b3 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -89,7 +89,7 @@ const ( BuildArchiveFilePath = "BuildArchiveFilePath" ZeropsYamlLocation = "ZeropsYamlLocation" UploadGitFolder = "UploadGitFolder" - ClientId = "ClientId" + OrgIdFlag = "OrgIdFlag" LogLimitFlag = "LogLimitFlag" LogMinSeverityFlag = "LogMinSeverityFlag" LogMsgTypeFlag = "LogMsgTypeFlag" @@ -100,6 +100,9 @@ const ( QuietModeFlag = "QuietModeFlag" TerminalFlag = "TerminalFlag" LogFilePathFlag = "LogFilePathFlag" + ConfirmFlag = "ConfirmFlag" + ServiceIdFlag = "ServiceIdFlag" + ProjectIdFlag = "ProjectIdFlag" // prompt PromptEnterZeropsServiceName = "PromptEnterZeropsServiceName" @@ -252,8 +255,13 @@ const ( ServiceSelectorListEmpty = "ServiceSelectorListEmpty" ServiceSelectorPrompt = "ServiceSelectorPrompt" ServiceSelectorOutOfRangeError = "ServiceSelectorOutOfRangeError" + OrgSelectorListEmpty = "OrgSelectorListEmpty" + OrgSelectorPrompt = "OrgSelectorPrompt" + OrgSelectorOutOfRangeError = "OrgSelectorOutOfRangeError" + SelectorAllowedOnlyInTerminal = "SelectorAllowedOnlyInTerminal" + PromptAllowedOnlyInTerminal = "PromptAllowedOnlyInTerminal" - // General + // Global SelectedProject = "SelectedProject" SelectedService = "SelectedService" ScopedProject = "ScopedProject" @@ -265,4 +273,6 @@ const ( ServiceIdInvalidFormat = "ServiceIdInvalidFormat" ServiceNotFound = "ServiceNotFound" + + DestructiveOperationConfirmationFailed = "DestructiveOperationConfirmationFailed" ) diff --git a/src/uxBlock/blocks.go b/src/uxBlock/blocks.go index 9f9fb7a1..b8f9111e 100644 --- a/src/uxBlock/blocks.go +++ b/src/uxBlock/blocks.go @@ -7,12 +7,36 @@ import ( "github.com/zeropsio/zcli/src/logger" ) -type UxBlocks struct { +//go:generate go run --mod=mod github.com/golang/mock/mockgen -source=$GOFILE -destination=$PWD/mocks/$GOFILE -package=mocks + +type UxBlocks interface { + PrintLine(values ...interface{}) + PrintSuccessLine(values ...string) + PrintInfoLine(values ...string) + PrintWarningLine(values ...string) + PrintErrorLine(values ...string) + PrintDebugLine(args ...interface{}) + Table(body *TableBody, auxOptions ...TableOption) + Select(ctx context.Context, tableBody *TableBody, auxOptions ...SelectOption) ([]int, error) + Prompt( + ctx context.Context, + message string, + choices []string, + auxOptions ...PromptOption, + ) (int, error) + RunSpinners(ctx context.Context, spinners []*Spinner, auxOptions ...SpinnerOption) func() +} + +type uxBlocks struct { isTerminal bool outputLogger logger.Logger debugFileLogger logger.Logger - // TODO - janhajek comment + // ctxCancel is used to cancel the context of the command. + // Bubbles package that we use to render graphic components steals the signal handler. + // In case that I want to cancel the context of a running component, e.g. spinner, the main context is not canceled. + // Therefore, we need to pass the cancel function to the uxBlocks. + // If the graphic component is canceled, we cancel the main context. ctxCancel context.CancelFunc } @@ -21,13 +45,13 @@ func NewBlock( debugFileLogger logger.Logger, isTerminal bool, ctxCancel context.CancelFunc, -) *UxBlocks { +) *uxBlocks { // safety check if ctxCancel == nil { ctxCancel = func() {} } - return &UxBlocks{ + return &uxBlocks{ outputLogger: outputLogger, debugFileLogger: debugFileLogger, isTerminal: isTerminal, diff --git a/src/uxBlock/logs.go b/src/uxBlock/logs.go index f9b5e1f6..3663192b 100644 --- a/src/uxBlock/logs.go +++ b/src/uxBlock/logs.go @@ -1,40 +1,40 @@ package uxBlock -func (b *UxBlocks) PrintLine(values ...interface{}) { +func (b *uxBlocks) PrintLine(values ...interface{}) { b.info(values...) } -func (b *UxBlocks) PrintSuccessLine(values ...string) { +func (b *uxBlocks) PrintSuccessLine(values ...string) { b.info(SuccessIcon, successColor.SetString(values...)) } -func (b *UxBlocks) PrintInfoLine(values ...string) { +func (b *uxBlocks) PrintInfoLine(values ...string) { b.info(InfoIcon, infoColor.SetString(values...)) } -func (b *UxBlocks) PrintWarningLine(values ...string) { +func (b *uxBlocks) PrintWarningLine(values ...string) { b.warning(WarningIcon, warningColor.SetString(values...)) } -func (b *UxBlocks) PrintErrorLine(values ...string) { +func (b *uxBlocks) PrintErrorLine(values ...string) { b.error(ErrorIcon, errorColor.SetString(values...)) } -func (b *UxBlocks) PrintDebugLine(args ...interface{}) { +func (b *uxBlocks) PrintDebugLine(args ...interface{}) { b.debugFileLogger.Debug(NewLine(args...).DisableStyle()) } -func (b *UxBlocks) info(args ...interface{}) { +func (b *uxBlocks) info(args ...interface{}) { b.outputLogger.Info(NewLine(args...)) b.debugFileLogger.Info(NewLine(args...).DisableStyle()) } -func (b *UxBlocks) warning(args ...interface{}) { +func (b *uxBlocks) warning(args ...interface{}) { b.outputLogger.Warning(NewLine(args...)) b.debugFileLogger.Warning(NewLine(args...).DisableStyle()) } -func (b *UxBlocks) error(args ...interface{}) { +func (b *uxBlocks) error(args ...interface{}) { b.outputLogger.Error(NewLine(args...)) b.debugFileLogger.Error(NewLine(args...).DisableStyle()) } diff --git a/src/uxBlock/mocks/blocks.go b/src/uxBlock/mocks/blocks.go new file mode 100644 index 00000000..a35e232a --- /dev/null +++ b/src/uxBlock/mocks/blocks.go @@ -0,0 +1,207 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: blocks.go + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + gomock "github.com/golang/mock/gomock" + uxBlock "github.com/zeropsio/zcli/src/uxBlock" + reflect "reflect" +) + +// MockUxBlocks is a mock of UxBlocks interface +type MockUxBlocks struct { + ctrl *gomock.Controller + recorder *MockUxBlocksMockRecorder +} + +// MockUxBlocksMockRecorder is the mock recorder for MockUxBlocks +type MockUxBlocksMockRecorder struct { + mock *MockUxBlocks +} + +// NewMockUxBlocks creates a new mock instance +func NewMockUxBlocks(ctrl *gomock.Controller) *MockUxBlocks { + mock := &MockUxBlocks{ctrl: ctrl} + mock.recorder = &MockUxBlocksMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockUxBlocks) EXPECT() *MockUxBlocksMockRecorder { + return m.recorder +} + +// PrintLine mocks base method +func (m *MockUxBlocks) PrintLine(values ...interface{}) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range values { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "PrintLine", varargs...) +} + +// PrintLine indicates an expected call of PrintLine +func (mr *MockUxBlocksMockRecorder) PrintLine(values ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintLine), values...) +} + +// PrintSuccessLine mocks base method +func (m *MockUxBlocks) PrintSuccessLine(values ...string) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range values { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "PrintSuccessLine", varargs...) +} + +// PrintSuccessLine indicates an expected call of PrintSuccessLine +func (mr *MockUxBlocksMockRecorder) PrintSuccessLine(values ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintSuccessLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintSuccessLine), values...) +} + +// PrintInfoLine mocks base method +func (m *MockUxBlocks) PrintInfoLine(values ...string) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range values { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "PrintInfoLine", varargs...) +} + +// PrintInfoLine indicates an expected call of PrintInfoLine +func (mr *MockUxBlocksMockRecorder) PrintInfoLine(values ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintInfoLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintInfoLine), values...) +} + +// PrintWarningLine mocks base method +func (m *MockUxBlocks) PrintWarningLine(values ...string) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range values { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "PrintWarningLine", varargs...) +} + +// PrintWarningLine indicates an expected call of PrintWarningLine +func (mr *MockUxBlocksMockRecorder) PrintWarningLine(values ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintWarningLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintWarningLine), values...) +} + +// PrintErrorLine mocks base method +func (m *MockUxBlocks) PrintErrorLine(values ...string) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range values { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "PrintErrorLine", varargs...) +} + +// PrintErrorLine indicates an expected call of PrintErrorLine +func (mr *MockUxBlocksMockRecorder) PrintErrorLine(values ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintErrorLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintErrorLine), values...) +} + +// PrintDebugLine mocks base method +func (m *MockUxBlocks) PrintDebugLine(args ...interface{}) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "PrintDebugLine", varargs...) +} + +// PrintDebugLine indicates an expected call of PrintDebugLine +func (mr *MockUxBlocksMockRecorder) PrintDebugLine(args ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintDebugLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintDebugLine), args...) +} + +// Table mocks base method +func (m *MockUxBlocks) Table(body *uxBlock.TableBody, auxOptions ...uxBlock.TableOption) { + m.ctrl.T.Helper() + varargs := []interface{}{body} + for _, a := range auxOptions { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Table", varargs...) +} + +// Table indicates an expected call of Table +func (mr *MockUxBlocksMockRecorder) Table(body interface{}, auxOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{body}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Table", reflect.TypeOf((*MockUxBlocks)(nil).Table), varargs...) +} + +// Select mocks base method +func (m *MockUxBlocks) Select(ctx context.Context, tableBody *uxBlock.TableBody, auxOptions ...uxBlock.SelectOption) ([]int, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, tableBody} + for _, a := range auxOptions { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Select", varargs...) + ret0, _ := ret[0].([]int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Select indicates an expected call of Select +func (mr *MockUxBlocksMockRecorder) Select(ctx, tableBody interface{}, auxOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, tableBody}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Select", reflect.TypeOf((*MockUxBlocks)(nil).Select), varargs...) +} + +// Prompt mocks base method +func (m *MockUxBlocks) Prompt(ctx context.Context, message string, choices []string, auxOptions ...uxBlock.PromptOption) (int, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, message, choices} + for _, a := range auxOptions { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Prompt", varargs...) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Prompt indicates an expected call of Prompt +func (mr *MockUxBlocksMockRecorder) Prompt(ctx, message, choices interface{}, auxOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, message, choices}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Prompt", reflect.TypeOf((*MockUxBlocks)(nil).Prompt), varargs...) +} + +// RunSpinners mocks base method +func (m *MockUxBlocks) RunSpinners(ctx context.Context, spinners []*uxBlock.Spinner, auxOptions ...uxBlock.SpinnerOption) func() { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, spinners} + for _, a := range auxOptions { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "RunSpinners", varargs...) + ret0, _ := ret[0].(func()) + return ret0 +} + +// RunSpinners indicates an expected call of RunSpinners +func (mr *MockUxBlocksMockRecorder) RunSpinners(ctx, spinners interface{}, auxOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, spinners}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunSpinners", reflect.TypeOf((*MockUxBlocks)(nil).RunSpinners), varargs...) +} diff --git a/src/uxBlock/prompt.go b/src/uxBlock/prompt.go index e88b05ad..c0b8fe7e 100644 --- a/src/uxBlock/prompt.go +++ b/src/uxBlock/prompt.go @@ -6,15 +6,15 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "github.com/zeropsio/zcli/src/i18n" ) type promptConfig struct { - label string } type PromptOption = func(cfg *promptConfig) -func (b *UxBlocks) Prompt( +func (b *uxBlocks) Prompt( ctx context.Context, message string, choices []string, @@ -25,9 +25,9 @@ func (b *UxBlocks) Prompt( opt(&cfg) } - // TODO - janhajek fix message if !b.isTerminal { - return 0, errors.New(cfg.label + ", you can choose only in terminal") + b.PrintLine(message) + return 0, errors.New(i18n.T(i18n.PromptAllowedOnlyInTerminal)) } model := &promptModel{ @@ -52,7 +52,7 @@ func (b *UxBlocks) Prompt( type promptModel struct { cfg promptConfig - uxBlocks *UxBlocks + uxBlocks *uxBlocks message string choices []string cursor int diff --git a/src/uxBlock/select.go b/src/uxBlock/select.go index e4408696..4818fd9d 100644 --- a/src/uxBlock/select.go +++ b/src/uxBlock/select.go @@ -9,6 +9,7 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss/table" + "github.com/zeropsio/zcli/src/i18n" ) type selectConfig struct { @@ -37,15 +38,15 @@ func SelectTableHeader(header *TableRow) SelectOption { type SelectOption = func(cfg *selectConfig) -func (b *UxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions ...SelectOption) ([]int, error) { +func (b *uxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions ...SelectOption) ([]int, error) { cfg := selectConfig{} for _, opt := range auxOptions { opt(&cfg) } - // TODO - janhajek fix message if !b.isTerminal { - return nil, errors.New(cfg.label + ", you can choose only in terminal") + b.PrintLine(cfg.label) + return nil, errors.New(i18n.T(i18n.SelectorAllowedOnlyInTerminal)) } model := &selectModel{ @@ -76,7 +77,7 @@ func (b *UxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions type selectModel struct { cfg selectConfig - uxBlocks *UxBlocks + uxBlocks *uxBlocks tableBody *TableBody cursor int selected map[int]struct{} diff --git a/src/uxBlock/showcase/main.go b/src/uxBlock/showcase/main.go index d7afcd49..ffcdc233 100644 --- a/src/uxBlock/showcase/main.go +++ b/src/uxBlock/showcase/main.go @@ -30,7 +30,7 @@ func main() { } } -func do(ctx context.Context, blocks *UxBlocks) error { +func do(ctx context.Context, blocks UxBlocks) error { prompts(ctx, blocks) spinners(ctx, blocks) texts(ctx, blocks) @@ -39,7 +39,7 @@ func do(ctx context.Context, blocks *UxBlocks) error { return nil } -func spinners(ctx context.Context, blocks *UxBlocks) { +func spinners(ctx context.Context, blocks UxBlocks) { { fmt.Println("========= spinners block =========") @@ -79,7 +79,7 @@ func spinners(ctx context.Context, blocks *UxBlocks) { } } -func prompts(ctx context.Context, blocks *UxBlocks) { +func prompts(ctx context.Context, blocks UxBlocks) { fmt.Println("========= prompt block =========") choices := []string{"yes", "no", "maybe"} choice, err := blocks.Prompt(ctx, "Question?", choices) @@ -92,7 +92,7 @@ func prompts(ctx context.Context, blocks *UxBlocks) { fmt.Println("========= prompt block end =========") } -func texts(ctx context.Context, blocks *UxBlocks) { +func texts(ctx context.Context, blocks UxBlocks) { fmt.Println("========= texts block =========") blocks.PrintInfoLine("info line") blocks.PrintWarningLine("warning line") @@ -101,7 +101,7 @@ func texts(ctx context.Context, blocks *UxBlocks) { fmt.Println("========= texts block end =========") } -func tables(ctx context.Context, blocks *UxBlocks) { +func tables(ctx context.Context, blocks UxBlocks) { fmt.Println("========= table selection block =========") tableData := [][]string{ @@ -145,7 +145,7 @@ func regSignals(contextCancel func()) { }() } -func createBlocks(contextCancelFunc func()) (*UxBlocks, error) { +func createBlocks(contextCancelFunc func()) (UxBlocks, error) { isTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) outputLogger := logger.NewOutputLogger(logger.OutputConfig{ diff --git a/src/uxBlock/spinner.go b/src/uxBlock/spinner.go index 63cee2e2..92e7e590 100644 --- a/src/uxBlock/spinner.go +++ b/src/uxBlock/spinner.go @@ -8,22 +8,19 @@ import ( tea "github.com/charmbracelet/bubbletea" ) -func (b *UxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOptions ...SpinnerOption) func() { +func (b *uxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOptions ...SpinnerOption) func() { cfg := spinnerConfig{} for _, opt := range auxOptions { opt(&cfg) } - //if !b.isTerminal { - // return func(success bool) { - // // TODO - janhajek - // //if success { - // // b.info(cfg.successMessage) - // //} else { - // // b.Error(cfg.failureMessage) - // //} - // } - //} + if !b.isTerminal { + return func() { + for _, spinner := range spinners { + b.PrintLine(spinner.text) + } + } + } model := &spinnerModel{ cfg: cfg, @@ -42,12 +39,6 @@ func (b *UxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOpti return func() { p.Send(spinnerEndCmd{}) p.Wait() - // TODO - janhajek - //if success { - // b.info(cfg.successMessage) - //} else { - // b.Error(cfg.failureMessage) - //} } } @@ -57,7 +48,7 @@ type spinnerEndCmd struct { type spinnerModel struct { cfg spinnerConfig spinners []*Spinner - uxBlocks *UxBlocks + uxBlocks *uxBlocks quiting bool canceled bool diff --git a/src/uxBlock/table.go b/src/uxBlock/table.go index a7102013..636da285 100644 --- a/src/uxBlock/table.go +++ b/src/uxBlock/table.go @@ -82,7 +82,7 @@ func WithTableHeader(header *TableRow) TableOption { type TableOption = func(cfg *tableConfig) -func (b *UxBlocks) Table(body *TableBody, auxOptions ...TableOption) { +func (b *uxBlocks) Table(body *TableBody, auxOptions ...TableOption) { cfg := tableConfig{} for _, opt := range auxOptions { opt(&cfg) diff --git a/src/uxHelpers/org.go b/src/uxHelpers/org.go new file mode 100644 index 00000000..a958263d --- /dev/null +++ b/src/uxHelpers/org.go @@ -0,0 +1,66 @@ +package uxHelpers + +import ( + "context" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" +) + +func PrintOrgSelector( + ctx context.Context, + uxBlocks uxBlock.UxBlocks, + restApiClient *zeropsRestApiClient.Handler, +) (*entity.Org, error) { + orgs, err := repository.GetAllOrgs(ctx, restApiClient) + if err != nil { + return nil, err + } + + if len(orgs) == 0 { + uxBlocks.PrintWarningLine(i18n.T(i18n.OrgSelectorListEmpty)) + return nil, nil + } + + header, tableBody := createOrgTableRows(orgs) + + orgIndex, err := uxBlocks.Select( + ctx, + tableBody, + uxBlock.SelectLabel(i18n.T(i18n.OrgSelectorPrompt)), + uxBlock.SelectTableHeader(header), + ) + if err != nil { + return nil, err + } + + if len(orgIndex) == 0 { + return nil, errors.New(i18n.T(i18n.OrgSelectorOutOfRangeError)) + } + + if orgIndex[0] > len(orgs)-1 { + return nil, errors.New(i18n.T(i18n.OrgSelectorOutOfRangeError)) + } + + return &orgs[orgIndex[0]], nil +} + +func createOrgTableRows(projects []entity.Org) (*uxBlock.TableRow, *uxBlock.TableBody) { + // TODO - janhajek translation + header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Role") + + tableBody := &uxBlock.TableBody{} + for _, project := range projects { + tableBody.AddStringsRow( + string(project.ID), + project.Name.String(), + project.Role.Native(), + ) + } + + return header, tableBody +} diff --git a/src/uxHelpers/project.go b/src/uxHelpers/project.go index 1b7e4a22..52ac8278 100644 --- a/src/uxHelpers/project.go +++ b/src/uxHelpers/project.go @@ -13,7 +13,7 @@ import ( func PrintProjectSelector( ctx context.Context, - uxBlocks *uxBlock.UxBlocks, + uxBlocks uxBlock.UxBlocks, restApiClient *zeropsRestApiClient.Handler, ) (*entity.Project, error) { projects, err := repository.GetAllProjects(ctx, restApiClient) @@ -51,7 +51,7 @@ func PrintProjectSelector( func PrintProjectList( ctx context.Context, - uxBlocks *uxBlock.UxBlocks, + uxBlocks uxBlock.UxBlocks, restApiClient *zeropsRestApiClient.Handler) error { projects, err := repository.GetAllProjects(ctx, restApiClient) if err != nil { @@ -67,7 +67,7 @@ func PrintProjectList( func createProjectTableRows(projects []entity.Project) (*uxBlock.TableRow, *uxBlock.TableBody) { // TODO - janhajek translation - header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Description", "Client ID", "Status") + header := (&uxBlock.TableRow{}).AddStringCells("ID", "Name", "Description", "Org ID", "Status") tableBody := &uxBlock.TableBody{} for _, project := range projects { diff --git a/src/uxHelpers/service.go b/src/uxHelpers/service.go index 764bc0c5..b49f3872 100644 --- a/src/uxHelpers/service.go +++ b/src/uxHelpers/service.go @@ -13,7 +13,7 @@ import ( func PrintServiceSelector( ctx context.Context, - uxBlocks *uxBlock.UxBlocks, + uxBlocks uxBlock.UxBlocks, restApiClient *zeropsRestApiClient.Handler, project entity.Project, ) (*entity.Service, error) { @@ -40,11 +40,11 @@ func PrintServiceSelector( } if len(serviceIndex) == 0 { - return nil, errors.New(i18n.T(i18n.ProjectSelectorOutOfRangeError)) + return nil, errors.New(i18n.T(i18n.ServiceSelectorOutOfRangeError)) } if serviceIndex[0] > len(services)-1 { - return nil, errors.New(i18n.T(i18n.ProjectSelectorOutOfRangeError)) + return nil, errors.New(i18n.T(i18n.ServiceSelectorOutOfRangeError)) } return &services[serviceIndex[0]], nil @@ -52,7 +52,7 @@ func PrintServiceSelector( func PrintServiceList( ctx context.Context, - uxBlocks *uxBlock.UxBlocks, + uxBlocks uxBlock.UxBlocks, restApiClient *zeropsRestApiClient.Handler, project entity.Project, ) error { diff --git a/src/uxHelpers/spinner.go b/src/uxHelpers/spinner.go index ef41297a..517f3bd5 100644 --- a/src/uxHelpers/spinner.go +++ b/src/uxHelpers/spinner.go @@ -16,8 +16,7 @@ import ( func ProcessCheckWithSpinner( ctx context.Context, - uxBlocks *uxBlock.UxBlocks, - restApiClient *zeropsRestApiClient.Handler, + uxBlocks uxBlock.UxBlocks, processList []Process, ) error { spinners := make([]*uxBlock.Spinner, 0, len(processList)) @@ -38,7 +37,7 @@ func ProcessCheckWithSpinner( defer wg.Done() process := processList[i] - err := checkProcess(ctx, process.Id, restApiClient) + err := process.F(ctx) if err != nil { spinners[i].Finish(uxBlock.NewLine(uxBlock.ErrorIcon, uxBlock.ErrorText(process.ErrorMessageMessage)).String()) stopFunc() @@ -59,40 +58,45 @@ func ProcessCheckWithSpinner( } type Process struct { - Id uuid.ProcessId + F func(ctx context.Context) error RunningMessage string ErrorMessageMessage string SuccessMessage string } -func checkProcess(ctx context.Context, processId uuid.ProcessId, restApiClient *zeropsRestApiClient.Handler) error { - ticker := time.NewTicker(time.Second) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return nil - case <-ticker.C: - getProcessResponse, err := restApiClient.GetProcess(ctx, path.ProcessId{Id: processId}) - if err != nil { - return err - } - - processOutput, err := getProcessResponse.Output() - if err != nil { - return err - } - - processStatus := processOutput.Status - - if processStatus == enum.ProcessStatusEnumFinished { +func CheckZeropsProcess( + processId uuid.ProcessId, + restApiClient *zeropsRestApiClient.Handler, +) func(ctx context.Context) error { + return func(ctx context.Context) error { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): return nil - } - - if !(processStatus == enum.ProcessStatusEnumRunning || - processStatus == enum.ProcessStatusEnumPending) { - return errors.Errorf(i18n.T(i18n.ProcessInvalidState), processId) + case <-ticker.C: + getProcessResponse, err := restApiClient.GetProcess(ctx, path.ProcessId{Id: processId}) + if err != nil { + return err + } + + processOutput, err := getProcessResponse.Output() + if err != nil { + return err + } + + processStatus := processOutput.Status + + if processStatus == enum.ProcessStatusEnumFinished { + return nil + } + + if !(processStatus == enum.ProcessStatusEnumRunning || + processStatus == enum.ProcessStatusEnumPending) { + return errors.Errorf(i18n.T(i18n.ProcessInvalidState), processId) + } } } } diff --git a/src/yamlReader/readYaml.go b/src/yamlReader/readYaml.go index aac56c9e..8c2312f9 100644 --- a/src/yamlReader/readYaml.go +++ b/src/yamlReader/readYaml.go @@ -10,7 +10,7 @@ import ( "github.com/zeropsio/zcli/src/uxBlock" ) -func ReadContent(uxBlocks *uxBlock.UxBlocks, importYamlPath string, workingDir string) ([]byte, error) { +func ReadContent(uxBlocks uxBlock.UxBlocks, importYamlPath string, workingDir string) ([]byte, error) { if !filepath.IsAbs(importYamlPath) { workingDir, err := filepath.Abs(workingDir) if err != nil { diff --git a/src/zeropsRestApiClient/errors.go b/src/zeropsRestApiClient/errors.go deleted file mode 100644 index 873af9da..00000000 --- a/src/zeropsRestApiClient/errors.go +++ /dev/null @@ -1,68 +0,0 @@ -package zeropsRestApiClient - -import ( - "github.com/pkg/errors" - "github.com/zeropsio/zerops-go/apiError" - "github.com/zeropsio/zerops-go/errorCode" -) - -type checkErrorConfig struct { - checks []func(error) error -} - -func CheckInvalidUserInput(paramName string, returnedErr error) CheckErrorOption { - return func(cfg *checkErrorConfig) { - cfg.checks = append(cfg.checks, func(err error) error { - var apiErr apiError.Error - if errors.As(err, &apiErr) { - if apiErr.GetErrorCode() == string(errorCode.InvalidUserInput) { - if typedMeta, ok := apiErr.GetMeta().([]interface{}); ok { - if len(typedMeta) > 0 { - if typed, ok := typedMeta[0].(map[string]interface{}); ok { - if param, exists := typed["parameter"]; exists { - if value, ok := param.(string); ok && value == paramName { - return returnedErr - } - } - } - } - } - } - } - - return nil - }) - } -} - -func CheckErrorCode(errorCode errorCode.ErrorCode, returnedErr error) CheckErrorOption { - return func(cfg *checkErrorConfig) { - cfg.checks = append(cfg.checks, func(err error) error { - var apiErr apiError.Error - if errors.As(err, &apiErr) { - if apiErr.GetErrorCode() == string(errorCode) { - return returnedErr - } - } - - return nil - }) - } -} - -type CheckErrorOption = func(cfg *checkErrorConfig) - -func CheckError(err error, auxOptions ...CheckErrorOption) error { - cfg := checkErrorConfig{} - for _, opt := range auxOptions { - opt(&cfg) - } - - for _, check := range cfg.checks { - if err := check(err); err != nil { - return err - } - } - - return err -} From c491c45a35b0f6bd2eb4cf478b9289099a044cbf Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Sun, 11 Feb 2024 13:50:47 +0100 Subject: [PATCH 07/12] update --- .golangci.yaml | 81 +++ cmd/main.go | 3 +- go.mod | 54 +- go.sum | 568 +++--------------- .../handler_findFilesByRules_test.go | 9 +- src/archiveClient/handler_findGitFiles.go | 5 +- src/archiveClient/handler_tarFiles_test.go | 16 +- src/cmd/bucket.go | 30 - src/cmd/bucketS3.go | 51 -- src/cmd/bucketS3Create.go | 82 --- src/cmd/bucketS3Delete.go | 79 --- src/cmd/bucketZerops.go | 14 - src/cmd/bucketZeropsCreate.go | 66 -- src/cmd/bucketZeropsDelete.go | 62 -- src/cmd/login.go | 6 +- src/cmd/project.go | 1 + src/cmd/projectDelete.go | 3 +- src/cmd/projectImport.go | 44 +- src/cmd/projectList.go | 1 + src/cmd/projectServiceImport.go | 1 + src/cmd/projectStart.go | 1 + src/cmd/projectStop.go | 1 + src/cmd/root.go | 1 - src/cmd/scope.go | 1 + src/cmd/scopeProject.go | 3 +- src/cmd/scopeReset.go | 3 +- src/cmd/service.go | 1 + src/cmd/serviceDelete.go | 3 +- src/cmd/serviceDeploy.go | 69 +-- src/cmd/serviceList.go | 1 + src/cmd/serviceLog.go | 2 +- src/cmd/servicePush.go | 125 +--- src/cmd/servicePushDeployShared.go | 150 +++++ src/cmd/serviceStart.go | 1 + src/cmd/serviceStop.go | 1 + src/cmd/status.go | 1 + src/cmd/statusInfo.go | 1 + src/cmd/statusShowDebugLogs.go | 16 +- src/cmd/version.go | 1 + src/cmdBuilder/cmd.go | 12 + src/cmdBuilder/cmdBuilderBuildCobraCmd.go | 6 +- src/cmdBuilder/cmdBuilderCreateRunFunc.go | 22 +- src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 6 +- src/cmdRunner/run.go | 24 +- src/cmdRunner/run_test.go | 16 +- src/constants/zerops.go | 3 +- src/entity/repository/appVersion.go | 1 - src/entity/repository/container.go | 1 - src/httpClient/handler.go | 24 +- src/i18n/en.go | 186 +++--- src/i18n/i18n.go | 154 +++-- src/logger/handler.go | 2 - src/params/handler.go | 38 +- src/region/region.go | 5 +- src/serviceLogs/handler_checkInputValues.go | 7 +- src/serviceLogs/handler_formatByRfc.go | 9 +- src/serviceLogs/handler_formatByTemplate.go | 5 +- src/serviceLogs/handler_formatLogs.go | 9 +- src/serviceLogs/handler_getServiceLogUrl.go | 4 +- src/serviceLogs/handler_ws.go | 12 +- src/storage/handler_test.go | 19 +- src/uxBlock/blocks.go | 5 +- src/uxBlock/prompt.go | 5 +- src/uxBlock/select.go | 63 +- src/uxBlock/showcase/main.go | 37 +- src/uxBlock/spinner.go | 8 +- src/uxBlock/table.go | 14 + src/{cmd/uxHelpers.go => uxHelpers/prompt.go} | 8 +- .../handler_get_service_stacks_by_project.go | 1 - tools/gomodrun.go | 5 +- tools/install.sh | 26 - 71 files changed, 795 insertions(+), 1500 deletions(-) delete mode 100644 src/cmd/bucket.go delete mode 100644 src/cmd/bucketS3.go delete mode 100644 src/cmd/bucketS3Create.go delete mode 100644 src/cmd/bucketS3Delete.go delete mode 100644 src/cmd/bucketZerops.go delete mode 100644 src/cmd/bucketZeropsCreate.go delete mode 100644 src/cmd/bucketZeropsDelete.go create mode 100644 src/cmd/servicePushDeployShared.go rename src/{cmd/uxHelpers.go => uxHelpers/prompt.go} (56%) diff --git a/.golangci.yaml b/.golangci.yaml index 72a83ff9..8e2a1795 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -29,6 +29,87 @@ linters: - godox - rowserrcheck - prealloc + - asasalint + - asciicheck + - bidichk + - bodyclose + - containedctx + - contextcheck + - deadcode + - decorder + - dogsled + - dupword + - durationcheck + - errcheck + - errchkjson + - errname + - errorlint + - execinquery + - exhaustive + - exportloopref + - forcetypeassert + - ginkgolinter + - gocheckcompilerdirectives + - gochecksumtype + - gocritic + - gocyclo + - godox + - gofmt + - goheader + - goimports + - gomoddirectives + - gomodguard + - goprintffuncname + - gosec + - gosimple + - gosmopolitan + - govet + - grouper + - ifshort + - importas + - ineffassign + - interfacebloat + - interfacer + - loggercheck + - maintidx + - makezero + - mirror + - misspell + - musttag + - nakedret + - nestif + - nilerr + - noctx + - nolintlint + - nosprintfhostport + - perfsprint + - prealloc + - predeclared + - promlinter + - protogetter + - reassign + - rowserrcheck + - scopelint + - sloglint + - sqlclosecheck + - staticcheck + - structcheck + - tagalign + - tagliatelle + - tenv + - testableexamples + - testifylint + - thelper + - tparallel + - typecheck + - unconvert + - unparam + - unused + - usestdlibvars + - varcheck + - wastedassign + - whitespace + - zerologlint disable-all: true fast: false diff --git a/cmd/main.go b/cmd/main.go index 8c03e3be..9879f005 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,8 +7,7 @@ import ( ) func main() { - err := cmd.ExecuteCmd() - if err != nil { + if cmd.ExecuteCmd() != nil { os.Exit(1) } } diff --git a/go.mod b/go.mod index 895c7e70..da70b39a 100644 --- a/go.mod +++ b/go.mod @@ -5,19 +5,19 @@ go 1.21 require github.com/zeropsio/zerops-go v1.0.4 require ( - github.com/aws/aws-sdk-go v1.44.77 - github.com/charmbracelet/bubbles v0.16.1 - github.com/charmbracelet/bubbletea v0.24.2 + github.com/charmbracelet/bubbles v0.18.0 + github.com/charmbracelet/bubbletea v0.25.0 github.com/charmbracelet/lipgloss v0.9.1 - github.com/google/uuid v1.4.0 - github.com/gorilla/websocket v1.5.0 + github.com/golang/mock v1.6.0 + github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.1 github.com/mattn/go-isatty v0.0.20 - github.com/onsi/gomega v1.10.1 github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.9.0 - github.com/spf13/cobra v1.5.0 - github.com/spf13/viper v1.13.0 - github.com/stretchr/testify v1.8.0 + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.8.0 + github.com/spf13/viper v1.18.2 + github.com/stretchr/testify v1.8.4 + golang.org/x/crypto v0.16.0 golang.org/x/text v0.14.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -25,14 +25,12 @@ require ( require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/golang/mock v1.4.4 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -40,22 +38,24 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rivo/uniseg v0.4.2 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/rivo/uniseg v0.4.6 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.4.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.1.0 // indirect + golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect - golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index a13aa168..9aa81e4e 100644 --- a/go.sum +++ b/go.sum @@ -1,172 +1,45 @@ -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= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -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= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/aws/aws-sdk-go v1.44.77 h1:m5rTfdv04/swD+vTuS2zn4NEwKX3yEJPMhiVCFDL/mU= -github.com/aws/aws-sdk-go v1.44.77/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= -github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= -github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY= -github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -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= -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/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/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= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -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/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -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/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -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/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= @@ -184,399 +57,102 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -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/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= -github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= +github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zeropsio/zerops-go v1.0.4 h1:FQM1M+/c9GwKezzc6TOvgPl2q3wjem+9JlpWpPQxLgM= github.com/zeropsio/zerops-go v1.0.4/go.mod h1:Nuqf1xWt53IRLyVoXgR4hF4ICc9jlfOfQgnN3ZhJR3E= -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.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -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= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -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/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/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/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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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-20190108225652-1e06a53dbb7e/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/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -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/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -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/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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-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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/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/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/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-20210104204734-6f8348627aad/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/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -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/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-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/tools v0.0.0-20180917221912-90fa682c2a6e/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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-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-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= -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= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -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-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -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/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -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-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -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/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -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/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.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -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-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -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= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/src/archiveClient/handler_findFilesByRules_test.go b/src/archiveClient/handler_findFilesByRules_test.go index d56d5bd0..c19e63c7 100644 --- a/src/archiveClient/handler_findFilesByRules_test.go +++ b/src/archiveClient/handler_findFilesByRules_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/golang/mock/gomock" - . "github.com/onsi/gomega" + "github.com/stretchr/testify/require" "github.com/zeropsio/zcli/src/uxBlock/mocks" ) @@ -228,13 +228,10 @@ func TestValidation(t *testing.T) { for _, test := range testErrorResponseDataProvider { test := test // scope lint t.Run(test.name+" in "+test.workingDir, func(t *testing.T) { - - RegisterTestingT(t) - archiver := New(Config{}) files, err := archiver.FindFilesByRules(uxBlocks, test.workingDir, test.input) - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) output := func() (res []string) { for _, f := range files { @@ -243,7 +240,7 @@ func TestValidation(t *testing.T) { return }() - Expect(output).To(Equal(test.output)) + require.Equal(t, test.output, output) }) } } diff --git a/src/archiveClient/handler_findGitFiles.go b/src/archiveClient/handler_findGitFiles.go index e18dc0c0..c208449b 100644 --- a/src/archiveClient/handler_findGitFiles.go +++ b/src/archiveClient/handler_findGitFiles.go @@ -9,6 +9,7 @@ import ( "path/filepath" "strings" + "github.com/pkg/errors" "github.com/zeropsio/zcli/src/cmdRunner" ) @@ -98,7 +99,7 @@ func (h *Handler) FindGitFiles(workingDir string) (res []File, _ error) { } } - return + return res, nil } func (h *Handler) listFiles(cmd *exec.Cmd, fn func(path string) error) error { @@ -112,7 +113,7 @@ func (h *Handler) listFiles(cmd *exec.Cmd, fn func(path string) error) error { lineB, _, err := rd.ReadLine() line := string(lineB) - if err == io.EOF { + if errors.Is(err, io.EOF) { if line != "" { if err := fn(line); err != nil { return err diff --git a/src/archiveClient/handler_tarFiles_test.go b/src/archiveClient/handler_tarFiles_test.go index 3a6de581..86a2b17e 100644 --- a/src/archiveClient/handler_tarFiles_test.go +++ b/src/archiveClient/handler_tarFiles_test.go @@ -8,12 +8,10 @@ import ( "io" "testing" - . "github.com/onsi/gomega" + "github.com/stretchr/testify/require" ) func TestSymlink(t *testing.T) { - RegisterTestingT(t) - archiver := New(Config{}) errChan := make(chan error) reader, writer := io.Pipe() @@ -30,26 +28,26 @@ func TestSymlink(t *testing.T) { ) gz, err := gzip.NewReader(reader) - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) b, err := io.ReadAll(gz) - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) r := tar.NewReader(bytes.NewReader(b)) - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) for { header, err := r.Next() if errors.Is(err, io.EOF) { break } - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) switch header.Typeflag { case tar.TypeSymlink: - Expect(header.Linkname).To(Equal("../file2.1.txt")) + require.Equal(t, "../file2.1.txt", header.Linkname) default: - Expect(errors.New("unknown type")).ShouldNot(HaveOccurred()) + t.Fatal("unknown type") } } } diff --git a/src/cmd/bucket.go b/src/cmd/bucket.go deleted file mode 100644 index 5c6f944b..00000000 --- a/src/cmd/bucket.go +++ /dev/null @@ -1,30 +0,0 @@ -package cmd - -import ( - "errors" - - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" -) - -func bucketCmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("bucket"). - Short(i18n.T(i18n.CmdBucket)). - AddChildrenCmd(bucketZeropsCmd()). - AddChildrenCmd(bucketS3Cmd()) -} - -// TODO - janhajek better place? -const ( - xAmzAclName = "x-amz-acl" -) - -func checkXAmzAcl(xAmzAcl string) error { - switch xAmzAcl { - case "", "private", "public-read", "public-read-write", "authenticated-read": - return nil - } - - return errors.New(i18n.T(i18n.BucketGenericXAmzAclInvalid)) -} diff --git a/src/cmd/bucketS3.go b/src/cmd/bucketS3.go deleted file mode 100644 index 08a76aa1..00000000 --- a/src/cmd/bucketS3.go +++ /dev/null @@ -1,51 +0,0 @@ -package cmd - -import ( - "errors" - "os" - - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" -) - -func bucketS3Cmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("s3"). - Short(i18n.T(i18n.CmdBucketS3)). - AddChildrenCmd(bucketS3CreateCmd()). - AddChildrenCmd(bucketS3DeleteCmd()) -} - -// TODO - janhajek better place? -const ( - s3ServerRegion = "us-east-1" - accessKeyIdName = "accessKeyId" - secretAccessKeyName = "secretAccessKey" -) - -func getAccessKeys(accessKeyId string, secretAccessKey string, serviceName string) (string, string, error) { - // only one of the flags is set - if (accessKeyId == "" && secretAccessKey != "") || (accessKeyId != "" && secretAccessKey == "") { - return "", "", errors.New(i18n.T(i18n.BucketS3FlagBothMandatory)) - } - - if accessKeyId == "" && secretAccessKey == "" { - if val, ok := os.LookupEnv(serviceName + "_" + accessKeyIdName); ok { - accessKeyId = val - } - if val, ok := os.LookupEnv(serviceName + "_" + secretAccessKeyName); ok { - secretAccessKey = val - } - - // only one of the env variables was set - if (accessKeyId == "" && secretAccessKey != "") || (accessKeyId != "" && secretAccessKey == "") { - return "", "", errors.New(i18n.T(i18n.BucketS3EnvBothMandatory)) - } - } - - if accessKeyId == "" || secretAccessKey == "" { - return "", "", errors.New(i18n.T(i18n.BucketS3FlagBothMandatory)) - } - - return accessKeyId, secretAccessKey, nil -} diff --git a/src/cmd/bucketS3Create.go b/src/cmd/bucketS3Create.go deleted file mode 100644 index b8abc0ec..00000000 --- a/src/cmd/bucketS3Create.go +++ /dev/null @@ -1,82 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/pkg/errors" - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" -) - -func bucketS3CreateCmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("create"). - Short(i18n.T(i18n.CmdBucketCreate)). - Long(i18n.T(i18n.CmdBucketCreate)). - ScopeLevel(cmdBuilder.Service). - Arg("bucketName"). - StringFlag(xAmzAclName, "", i18n.T(i18n.BucketGenericXAmzAcl)). - StringFlag(accessKeyIdName, "", i18n.T(i18n.BucketS3AccessKeyId)). - StringFlag(secretAccessKeyName, "", i18n.T(i18n.BucketS3SecretAccessKey)). - LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { - uxBlocks := cmdData.UxBlocks - - xAmzAcl := cmdData.Params.GetString(xAmzAclName) - err := checkXAmzAcl(xAmzAcl) - if err != nil { - return err - } - - accessKeyId, secretAccessKey, err := getAccessKeys( - cmdData.Params.GetString(accessKeyIdName), - cmdData.Params.GetString(secretAccessKeyName), - cmdData.Service.Name.String(), - ) - if err != nil { - return err - } - - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), cmdData.Args["bucketName"][0]) - - uxBlocks.PrintLine(i18n.T(i18n.BucketCreateCreatingDirect, bucketName)) - uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) - - awsConf := aws.NewConfig(). - WithEndpoint(cmdData.CliStorage.Data().RegionData.S3StorageAddress). - WithRegion(s3ServerRegion). - WithS3ForcePathStyle(true). - WithCredentials( - credentials.NewStaticCredentials(accessKeyId, secretAccessKey, ""), - ) - - sess, err := session.NewSession(awsConf) - if err != nil { - return err - } - - bucketInput := (&s3.CreateBucketInput{}). - SetACL(xAmzAclName). - SetBucket(bucketName) - - if _, err := s3.New(sess).CreateBucketWithContext(ctx, bucketInput); err != nil { - var s3Err s3.RequestFailure - if errors.As(err, &s3Err) { - if s3Err.Code() == s3.ErrCodeBucketAlreadyExists { - return errors.New(i18n.T(i18n.BucketS3BucketAlreadyExists)) - } - return errors.Errorf(i18n.T(i18n.BucketS3RequestFailed), s3Err) - } - return err - } - - uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketCreated)) - - return nil - }) -} diff --git a/src/cmd/bucketS3Delete.go b/src/cmd/bucketS3Delete.go deleted file mode 100644 index eb62da3b..00000000 --- a/src/cmd/bucketS3Delete.go +++ /dev/null @@ -1,79 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/pkg/errors" - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" -) - -func bucketS3DeleteCmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("delete"). - Short(i18n.T(i18n.CmdBucketDelete)). - ScopeLevel(cmdBuilder.Service). - Arg("bucketName"). - StringFlag(accessKeyIdName, "", i18n.T(i18n.BucketS3AccessKeyId)). - StringFlag(secretAccessKeyName, "", i18n.T(i18n.BucketS3SecretAccessKey)). - BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). - LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { - uxBlocks := cmdData.UxBlocks - - accessKeyId, secretAccessKey, err := getAccessKeys( - cmdData.Params.GetString(accessKeyIdName), - cmdData.Params.GetString(secretAccessKeyName), - cmdData.Service.Name.String(), - ) - if err != nil { - return err - } - - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(accessKeyId), cmdData.Args["bucketName"][0]) - - if !cmdData.Params.GetBool("confirm") { - err = YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) - if err != nil { - return err - } - } - - uxBlocks.PrintLine(i18n.T(i18n.BucketDeleteDeletingDirect, bucketName)) - uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) - - awsConf := aws.NewConfig(). - WithEndpoint(cmdData.CliStorage.Data().RegionData.S3StorageAddress). - WithRegion(s3ServerRegion). - WithS3ForcePathStyle(true). - WithCredentials( - credentials.NewStaticCredentials(accessKeyId, secretAccessKey, ""), - ) - - sess, err := session.NewSession(awsConf) - if err != nil { - return err - } - - bucketInput := (&s3.DeleteBucketInput{}). - SetBucket(bucketName). - SetExpectedBucketOwner(accessKeyId) - - if _, err := s3.New(sess).DeleteBucketWithContext(ctx, bucketInput); err != nil { - var s3Err s3.RequestFailure - if errors.As(err, &s3Err) { - return errors.Errorf(i18n.T(i18n.BucketS3RequestFailed), s3Err) - } - return err - } - - uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketDeleted)) - - return nil - }) -} diff --git a/src/cmd/bucketZerops.go b/src/cmd/bucketZerops.go deleted file mode 100644 index de49f9e0..00000000 --- a/src/cmd/bucketZerops.go +++ /dev/null @@ -1,14 +0,0 @@ -package cmd - -import ( - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" -) - -func bucketZeropsCmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("zerops"). - Short(i18n.T(i18n.CmdBucketZerops)). - AddChildrenCmd(bucketZeropsCreateCmd()). - AddChildrenCmd(bucketZeropsDeleteCmd()) -} diff --git a/src/cmd/bucketZeropsCreate.go b/src/cmd/bucketZeropsCreate.go deleted file mode 100644 index 7c79c31c..00000000 --- a/src/cmd/bucketZeropsCreate.go +++ /dev/null @@ -1,66 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "strings" - - "github.com/pkg/errors" - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zerops-go/dto/input/body" - "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/types" - "github.com/zeropsio/zerops-go/types/enum" -) - -func bucketZeropsCreateCmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("create"). - Short(i18n.T(i18n.CmdBucketCreate)). - ScopeLevel(cmdBuilder.Service). - Arg("bucketName"). - StringFlag(xAmzAclName, "", i18n.T(i18n.BucketGenericXAmzAcl)). - LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { - uxBlocks := cmdData.UxBlocks - - xAmzAcl := cmdData.Params.GetString(xAmzAclName) - err := checkXAmzAcl(xAmzAcl) - if err != nil { - return err - } - - if cmdData.Service.ServiceTypeCategory != enum.ServiceStackTypeCategoryEnumObjectStorage { - return errors.New(i18n.T(i18n.BucketGenericOnlyForObjectStorage)) - } - - serviceId := cmdData.Service.ID - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(serviceId.Native()), cmdData.Args["bucketName"][0]) - - uxBlocks.PrintLine(i18n.T(i18n.BucketCreateCreatingZeropsApi, bucketName)) - uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) - - bucketBody := body.PostS3Bucket{ - Name: types.NewString(bucketName), - } - if xAmzAcl != "" { - bucketBody.XAmzAcl = types.NewStringNull(xAmzAcl) - } - - resp, err := cmdData.RestApiClient.PostS3Bucket( - ctx, - path.ServiceStackIdNamed{ServiceStackId: serviceId}, - bucketBody, - ) - if err != nil { - return err - } - if _, err := resp.Output(); err != nil { - return err - } - - uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketCreated)) - - return nil - }) -} diff --git a/src/cmd/bucketZeropsDelete.go b/src/cmd/bucketZeropsDelete.go deleted file mode 100644 index 50c7a6fc..00000000 --- a/src/cmd/bucketZeropsDelete.go +++ /dev/null @@ -1,62 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "strings" - - "github.com/pkg/errors" - "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/types" - "github.com/zeropsio/zerops-go/types/enum" -) - -func bucketZeropsDeleteCmd() *cmdBuilder.Cmd { - return cmdBuilder.NewCmd(). - Use("delete"). - Short(i18n.T(i18n.CmdBucketDelete)). - ScopeLevel(cmdBuilder.Service). - Arg("bucketName"). - BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). - LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { - uxBlocks := cmdData.UxBlocks - - if cmdData.Service.ServiceTypeCategory != enum.ServiceStackTypeCategoryEnumObjectStorage { - return errors.New(i18n.T(i18n.BucketGenericOnlyForObjectStorage)) - } - - serviceId := cmdData.Service.ID - // TODO - janhajek duplicate - bucketName := fmt.Sprintf("%s.%s", strings.ToLower(serviceId.Native()), cmdData.Args["bucketName"][0]) - - if !cmdData.Params.GetBool("confirm") { - err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.BucketDeleteConfirm, bucketName)) - if err != nil { - return err - } - } - - uxBlocks.PrintLine(i18n.T(i18n.BucketDeleteDeletingZeropsApi, bucketName)) - uxBlocks.PrintLine(i18n.T(i18n.BucketGenericBucketNamePrefixed)) - - resp, err := cmdData.RestApiClient.DeleteS3( - ctx, - path.S3Bucket{ - ServiceStackId: serviceId, - Name: types.NewString(bucketName), - }, - ) - if err != nil { - return err - } - if _, err := resp.Output(); err != nil { - return err - } - - uxBlocks.PrintSuccessLine(i18n.T(i18n.BucketDeleted)) - - return nil - }) -} diff --git a/src/cmd/login.go b/src/cmd/login.go index a6027278..0fd65cc7 100644 --- a/src/cmd/login.go +++ b/src/cmd/login.go @@ -21,13 +21,14 @@ func loginCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdLogin)). StringFlag("regionUrl", constants.DefaultRegionUrl, i18n.T(i18n.RegionUrlFlag), cmdBuilder.HiddenFlag()). StringFlag("region", "", i18n.T(i18n.RegionFlag), cmdBuilder.HiddenFlag()). + HelpFlag(i18n.T(i18n.LoginHelp)). Arg("token"). GuestRunFunc(func(ctx context.Context, cmdData *cmdBuilder.GuestCmdData) error { uxBlocks := cmdData.UxBlocks regionRetriever := region.New(httpClient.New(ctx, httpClient.Config{HttpTimeout: time.Minute * 5})) - regions, err := regionRetriever.RetrieveAllFromURL(cmdData.Params.GetString("regionUrl")) + regions, err := regionRetriever.RetrieveAllFromURL(ctx, cmdData.Params.GetString("regionUrl")) if err != nil { return err } @@ -85,8 +86,7 @@ func getLoginRegion( } } - // TODO - janhajek translation - header := (&uxBlock.TableRow{}).AddStringCells("Name") + header := (&uxBlock.TableRow{}).AddStringCells(i18n.T(i18n.RegionTableColumnName)) tableBody := &uxBlock.TableBody{} for _, reg := range regions { diff --git a/src/cmd/project.go b/src/cmd/project.go index 99f1e262..477c8da6 100644 --- a/src/cmd/project.go +++ b/src/cmd/project.go @@ -9,6 +9,7 @@ func projectCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("project"). Short(i18n.T(i18n.CmdProject)). + HelpFlag(i18n.T(i18n.ProjectHelp)). AddChildrenCmd(projectListCmd()). AddChildrenCmd(projectStartCmd()). AddChildrenCmd(projectStopCmd()). diff --git a/src/cmd/projectDelete.go b/src/cmd/projectDelete.go index 8e41089d..87c68134 100644 --- a/src/cmd/projectDelete.go +++ b/src/cmd/projectDelete.go @@ -17,9 +17,10 @@ func projectDeleteCmd() *cmdBuilder.Cmd { ScopeLevel(cmdBuilder.Project). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). + HelpFlag(i18n.T(i18n.ProjectDeleteHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { if !cmdData.Params.GetBool("confirm") { - err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ProjectDeleteConfirm, cmdData.Project.Name)) + err := uxHelpers.YesNoPromptDestructive(ctx, cmdData.UxBlocks, i18n.T(i18n.ProjectDeleteConfirm, cmdData.Project.Name)) if err != nil { return err } diff --git a/src/cmd/projectImport.go b/src/cmd/projectImport.go index f5f59690..0428bf37 100644 --- a/src/cmd/projectImport.go +++ b/src/cmd/projectImport.go @@ -23,26 +23,13 @@ func projectImportCmd() *cmdBuilder.Cmd { Arg(projectImportArgName). StringFlag("orgId", "", i18n.T(i18n.OrgIdFlag)). StringFlag("workingDie", "./", i18n.T(i18n.BuildWorkingDir)). + HelpFlag(i18n.T(i18n.ProjectImportHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks - orgId := uuid.ClientId(cmdData.Params.GetString("orgId")) - if orgId == "" { - orgs, err := repository.GetAllOrgs(ctx, cmdData.RestApiClient) - if err != nil { - return err - } - - if len(orgs) == 1 { - orgId = orgs[0].ID - } else { - selectedOrg, err := uxHelpers.PrintOrgSelector(ctx, uxBlocks, cmdData.RestApiClient) - if err != nil { - return err - } - - orgId = selectedOrg.ID - } + orgId, err := getOrgId(ctx, cmdData) + if err != nil { + return err } yamlContent, err := yamlReader.ReadContent( @@ -96,3 +83,26 @@ func projectImportCmd() *cmdBuilder.Cmd { return nil }) } + +func getOrgId(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) (uuid.ClientId, error) { + orgId := uuid.ClientId(cmdData.Params.GetString("orgId")) + if orgId != "" { + return orgId, nil + } + + orgs, err := repository.GetAllOrgs(ctx, cmdData.RestApiClient) + if err != nil { + return "", err + } + + if len(orgs) == 1 { + return orgs[0].ID, nil + } + + selectedOrg, err := uxHelpers.PrintOrgSelector(ctx, cmdData.UxBlocks, cmdData.RestApiClient) + if err != nil { + return "", err + } + + return selectedOrg.ID, nil +} diff --git a/src/cmd/projectList.go b/src/cmd/projectList.go index 260c02e2..e98c7688 100644 --- a/src/cmd/projectList.go +++ b/src/cmd/projectList.go @@ -12,6 +12,7 @@ func projectListCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("list"). Short(i18n.T(i18n.CmdProjectList)). + HelpFlag(i18n.T(i18n.ProjectListHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { err := uxHelpers.PrintProjectList(ctx, cmdData.UxBlocks, cmdData.RestApiClient) if err != nil { diff --git a/src/cmd/projectServiceImport.go b/src/cmd/projectServiceImport.go index a916d25f..6e984ec7 100644 --- a/src/cmd/projectServiceImport.go +++ b/src/cmd/projectServiceImport.go @@ -19,6 +19,7 @@ func projectServiceImportCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceImport)). ScopeLevel(cmdBuilder.Project). Arg(serviceImportArgName). + HelpFlag(i18n.T(i18n.ProjectServiceImportHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks diff --git a/src/cmd/projectStart.go b/src/cmd/projectStart.go index 1fb196dc..8292d849 100644 --- a/src/cmd/projectStart.go +++ b/src/cmd/projectStart.go @@ -15,6 +15,7 @@ func projectStartCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdProjectStart)). ScopeLevel(cmdBuilder.Project). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + HelpFlag(i18n.T(i18n.ProjectStartHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { startProjectResponse, err := cmdData.RestApiClient.PutProjectStart( ctx, diff --git a/src/cmd/projectStop.go b/src/cmd/projectStop.go index 8aeb7ef2..d84460da 100644 --- a/src/cmd/projectStop.go +++ b/src/cmd/projectStop.go @@ -16,6 +16,7 @@ func projectStopCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdProjectStop)). ScopeLevel(cmdBuilder.Project). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + HelpFlag(i18n.T(i18n.ProjectStopHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { stopProjectResponse, err := cmdData.RestApiClient.PutProjectStop( ctx, diff --git a/src/cmd/root.go b/src/cmd/root.go index 5024c6de..2e6c18cf 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -13,7 +13,6 @@ func ExecuteCmd() error { cmdBuilder.AddCommand(projectCmd()) cmdBuilder.AddCommand(serviceCmd()) cmdBuilder.AddCommand(statusCmd()) - cmdBuilder.AddCommand(bucketCmd()) return cmdBuilder.CreateAndExecuteRootCobraCmd() } diff --git a/src/cmd/scope.go b/src/cmd/scope.go index feeb75be..e2a9b8d2 100644 --- a/src/cmd/scope.go +++ b/src/cmd/scope.go @@ -9,6 +9,7 @@ func scopeCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("scope"). Short(i18n.T(i18n.CmdScope)). + HelpFlag(i18n.T(i18n.ScopeHelp)). AddChildrenCmd(scopeProjectCmd()). AddChildrenCmd(scopeResetCmd()) } diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go index 4b99d20e..0a7f8007 100644 --- a/src/cmd/scopeProject.go +++ b/src/cmd/scopeProject.go @@ -28,8 +28,7 @@ func scopeProjectCmd() *cmdBuilder.Cmd { } cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) } else { - // TODO - janhajek message - cmdData.UxBlocks.PrintInfoLine("previously scoped project: " + project.Name.String()) + cmdData.UxBlocks.PrintInfoLine(i18n.T(i18n.PreviouslyScopedProject, project.Name.String())) } } diff --git a/src/cmd/scopeReset.go b/src/cmd/scopeReset.go index c92dc602..bfb23dcc 100644 --- a/src/cmd/scopeReset.go +++ b/src/cmd/scopeReset.go @@ -22,8 +22,7 @@ func scopeResetCmd() *cmdBuilder.Cmd { return err } - // TODO - janhajek message - cmdData.UxBlocks.PrintInfoLine("scope reset") + cmdData.UxBlocks.PrintInfoLine(i18n.T(i18n.ScopeReset)) return nil }) diff --git a/src/cmd/service.go b/src/cmd/service.go index 6eb65471..88bca53a 100644 --- a/src/cmd/service.go +++ b/src/cmd/service.go @@ -9,6 +9,7 @@ func serviceCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("service"). Short(i18n.T(i18n.CmdService)). + Short(i18n.T(i18n.ServiceHelp)). AddChildrenCmd(serviceDeleteCmd()). AddChildrenCmd(serviceListCmd()). AddChildrenCmd(serviceLogCmd()). diff --git a/src/cmd/serviceDelete.go b/src/cmd/serviceDelete.go index a09e45b7..ef2db851 100644 --- a/src/cmd/serviceDelete.go +++ b/src/cmd/serviceDelete.go @@ -16,9 +16,10 @@ func serviceDeleteCmd() *cmdBuilder.Cmd { ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). + Short(i18n.T(i18n.ServiceDeleteHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { if !cmdData.Params.GetBool("confirm") { - err := YesNoPromptDestructive(ctx, cmdData, i18n.T(i18n.ServiceDeleteConfirm, cmdData.Service.Name)) + err := uxHelpers.YesNoPromptDestructive(ctx, cmdData.UxBlocks, i18n.T(i18n.ServiceDeleteConfirm, cmdData.Service.Name)) if err != nil { return err } diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go index 1e470713..8cc8e3ca 100644 --- a/src/cmd/serviceDeploy.go +++ b/src/cmd/serviceDeploy.go @@ -4,19 +4,13 @@ import ( "context" "encoding/base64" "io" - "os" - "path/filepath" "time" - "github.com/pkg/errors" "github.com/zeropsio/zcli/src/archiveClient" "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/uxBlock" "github.com/zeropsio/zcli/src/uxHelpers" - "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/dto/input/body" "github.com/zeropsio/zerops-go/dto/input/path" "github.com/zeropsio/zerops-go/types" @@ -32,8 +26,9 @@ func serviceDeployCmd() *cmdBuilder.Cmd { StringFlag("workingDir", "./", i18n.T(i18n.BuildWorkingDir)). StringFlag("archiveFilePath", "", i18n.T(i18n.BuildArchiveFilePath)). StringFlag("versionName", "", i18n.T(i18n.BuildVersionName)). - StringFlag("zeropsYamlPath", "", i18n.T(i18n.SourceName)). + StringFlag("zeropsYamlPath", "", i18n.T(i18n.ZeropsYamlLocation)). BoolFlag("deployGitFolder", false, i18n.T(i18n.ZeropsYamlLocation)). + Short(i18n.T(i18n.ServiceDeployHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks @@ -106,7 +101,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { cmdData.UxBlocks, []uxHelpers.Process{{ F: func(ctx context.Context) error { - if err := packageUpload(httpClient, appVersion.UploadUrl.String(), reader); err != nil { + if err := packageUpload(ctx, httpClient, appVersion.UploadUrl.String(), reader); err != nil { // if an error occurred while packing the app, return that error select { case err := <-tarErrChan: @@ -170,61 +165,3 @@ func serviceDeployCmd() *cmdBuilder.Cmd { return nil }) } - -func getValidConfigContent(uxBlocks uxBlock.UxBlocks, workingDir string, zeropsYamlPath string) ([]byte, error) { - workingDir, err := filepath.Abs(workingDir) - if err != nil { - return nil, err - } - - if zeropsYamlPath != "" { - workingDir = filepath.Join(workingDir, zeropsYamlPath) - } - - zeropsYamlPath = filepath.Join(workingDir, ZeropsYamlFileName) - - zeropsYamlStat, err := os.Stat(zeropsYamlPath) - if err != nil { - if os.IsNotExist(err) { - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound, zeropsYamlPath)) - } - return nil, err - } - - uxBlocks.PrintLine(i18n.T(i18n.BuildDeployZeropsYamlFound, zeropsYamlPath)) - - if zeropsYamlStat.Size() == 0 { - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlEmpty)) - } - if zeropsYamlStat.Size() > 10*1024 { - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlTooLarge)) - } - - yamlContent, err := os.ReadFile(zeropsYamlPath) - if err != nil { - return nil, err - } - - return yamlContent, nil -} - -func validateZeropsYamlContent( - ctx context.Context, - restApiClient *zeropsRestApiClient.Handler, - service *entity.Service, - yamlContent []byte, -) error { - resp, err := restApiClient.PostServiceStackZeropsYamlValidation(ctx, body.ZeropsYamlValidation{ - Name: service.Name, - ServiceStackTypeId: service.ServiceTypeId, - ZeropsYaml: types.NewText(string(yamlContent)), - }) - if err != nil { - return err - } - if _, err = resp.Output(); err != nil { - return err - } - - return nil -} diff --git a/src/cmd/serviceList.go b/src/cmd/serviceList.go index fc24ad76..96c2f6f2 100644 --- a/src/cmd/serviceList.go +++ b/src/cmd/serviceList.go @@ -14,6 +14,7 @@ func serviceListCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdProjectList)). ScopeLevel(cmdBuilder.Project). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + Short(i18n.T(i18n.ServiceListHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { err := uxHelpers.PrintServiceList(ctx, cmdData.UxBlocks, cmdData.RestApiClient, *cmdData.Project) if err != nil { diff --git a/src/cmd/serviceLog.go b/src/cmd/serviceLog.go index a0b1f354..2c72556a 100644 --- a/src/cmd/serviceLog.go +++ b/src/cmd/serviceLog.go @@ -18,7 +18,6 @@ func serviceLogCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceLog)). Long(i18n.T(i18n.CmdServiceLogLong)+i18n.T(i18n.ServiceLogAdditional)). ScopeLevel(cmdBuilder.Service). - StringFlag("x-amz-acl", "", i18n.T(i18n.BucketGenericXAmzAcl)). IntFlag("limit", 100, i18n.T(i18n.LogLimitFlag)). StringFlag("minimumSeverity", "", i18n.T(i18n.LogMinSeverityFlag)). StringFlag("messageType", "APPLICATION", i18n.T(i18n.LogMsgTypeFlag)). @@ -26,6 +25,7 @@ func serviceLogCmd() *cmdBuilder.Cmd { StringFlag("formatTemplate", "", i18n.T(i18n.LogFormatTemplateFlag)). BoolFlag("follow", false, i18n.T(i18n.LogFollowFlag)). BoolFlag("showBuildLogs", false, i18n.T(i18n.LogShowBuildFlag)). + Short(i18n.T(i18n.ServiceLogHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { handler := serviceLogs.New( serviceLogs.Config{}, diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go index 26ef3803..55670695 100644 --- a/src/cmd/servicePush.go +++ b/src/cmd/servicePush.go @@ -4,28 +4,18 @@ import ( "context" "encoding/base64" "io" - "net/http" - "os" - "path/filepath" "time" - "github.com/pkg/errors" "github.com/zeropsio/zcli/src/archiveClient" "github.com/zeropsio/zcli/src/cmdBuilder" - "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxHelpers" - "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/dto/input/body" "github.com/zeropsio/zerops-go/dto/input/path" - "github.com/zeropsio/zerops-go/dto/output" "github.com/zeropsio/zerops-go/types" ) -// TODO - janhajek shared -const ZeropsYamlFileName = "zerops.yaml" - func servicePushCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("push"). @@ -36,7 +26,9 @@ func servicePushCmd() *cmdBuilder.Cmd { StringFlag("archiveFilePath", "", i18n.T(i18n.BuildArchiveFilePath)). StringFlag("versionName", "", i18n.T(i18n.BuildVersionName)). StringFlag("source", "", i18n.T(i18n.SourceName)). + StringFlag("zeropsYamlPath", "", i18n.T(i18n.ZeropsYamlLocation)). BoolFlag("deployGitFolder", false, i18n.T(i18n.UploadGitFolder)). + Short(i18n.T(i18n.ServicePushHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks @@ -46,12 +38,21 @@ func servicePushCmd() *cmdBuilder.Cmd { uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart)) - files, err := arch.FindGitFiles(cmdData.Params.GetString("workingDir")) + configContent, err := getValidConfigContent( + uxBlocks, + cmdData.Params.GetString("workingDir"), + cmdData.Params.GetString("zeropsYamlPath"), + ) if err != nil { return err } - configContent, err := buildConfigContent(files) + err = validateZeropsYamlContent(ctx, cmdData.RestApiClient, cmdData.Service, configContent) + if err != nil { + return err + } + + files, err := arch.FindGitFiles(cmdData.Params.GetString("workingDir")) if err != nil { return err } @@ -96,7 +97,7 @@ func servicePushCmd() *cmdBuilder.Cmd { cmdData.UxBlocks, []uxHelpers.Process{{ F: func(ctx context.Context) error { - if err := packageUpload(httpClient, appVersion.UploadUrl.String(), reader); err != nil { + if err := packageUpload(ctx, httpClient, appVersion.UploadUrl.String(), reader); err != nil { // if an error occurred while packing the app, return that error select { case err := <-tarErrChan: @@ -170,101 +171,3 @@ func servicePushCmd() *cmdBuilder.Cmd { return nil }) } - -func createAppVersion( - ctx context.Context, - restApiClient *zeropsRestApiClient.Handler, - service *entity.Service, - versionName string, -) (output.PostAppVersion, error) { - appVersionResponse, err := restApiClient.PostAppVersion( - ctx, - body.PostAppVersion{ - ServiceStackId: service.ID, - Name: func() types.StringNull { - if versionName != "" { - return types.NewStringNull(versionName) - } - return types.StringNull{} - }(), - }, - ) - if err != nil { - return output.PostAppVersion{}, err - } - appVersion, err := appVersionResponse.Output() - if err != nil { - return output.PostAppVersion{}, err - } - - return appVersion, nil -} - -func openPackageFile(archiveFilePath string, workingDir string) (*os.File, error) { - workingDir, err := filepath.Abs(workingDir) - if err != nil { - return nil, err - } - - archiveFilePath = filepath.Join(workingDir, archiveFilePath) - - filePath, err := filepath.Abs(archiveFilePath) - if err != nil { - return nil, err - } - - // check if the target file exists - _, err = os.Stat(filePath) - if err != nil && !os.IsNotExist(err) { - return nil, err - } - if err == nil { - return nil, errors.Errorf(i18n.T(i18n.ArchClientFileAlreadyExists), archiveFilePath) - } - - file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0660) - if err != nil { - return nil, err - } - - return file, nil -} - -func packageUpload(client *httpClient.Handler, uploadUrl string, reader io.Reader) error { - cephResponse, err := client.PutStream(uploadUrl, reader, httpClient.ContentType("application/gzip")) - if err != nil { - return err - } - if cephResponse.StatusCode != http.StatusCreated { - return errors.New(i18n.T(i18n.BuildDeployUploadPackageFailed)) - } - - return nil -} - -func buildConfigContent(files []archiveClient.File) ([]byte, error) { - for _, file := range files { - if file.ArchivePath == ZeropsYamlFileName { - stat, err := os.Stat(file.SourcePath) - if err != nil { - return nil, err - } - - if stat.Size() == 0 { - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlEmpty)) - } - if stat.Size() > 10*1024 { - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlTooLarge)) - } - - buildConfigContent, err := os.ReadFile(file.SourcePath) - if err != nil { - return nil, err - } - - return buildConfigContent, nil - } - } - - return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound)) -} diff --git a/src/cmd/servicePushDeployShared.go b/src/cmd/servicePushDeployShared.go new file mode 100644 index 00000000..4cb37dcf --- /dev/null +++ b/src/cmd/servicePushDeployShared.go @@ -0,0 +1,150 @@ +package cmd + +import ( + "context" + "io" + "net/http" + "os" + "path/filepath" + + "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/httpClient" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/output" + "github.com/zeropsio/zerops-go/types" +) + +const ZeropsYamlFileName = "zerops.yml" + +func createAppVersion( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service *entity.Service, + versionName string, +) (output.PostAppVersion, error) { + appVersionResponse, err := restApiClient.PostAppVersion( + ctx, + body.PostAppVersion{ + ServiceStackId: service.ID, + Name: func() types.StringNull { + if versionName != "" { + return types.NewStringNull(versionName) + } + return types.StringNull{} + }(), + }, + ) + if err != nil { + return output.PostAppVersion{}, err + } + appVersion, err := appVersionResponse.Output() + if err != nil { + return output.PostAppVersion{}, err + } + + return appVersion, nil +} + +func openPackageFile(archiveFilePath string, workingDir string) (*os.File, error) { + workingDir, err := filepath.Abs(workingDir) + if err != nil { + return nil, err + } + + archiveFilePath = filepath.Join(workingDir, archiveFilePath) + + filePath, err := filepath.Abs(archiveFilePath) + if err != nil { + return nil, err + } + + // check if the target file exists + _, err = os.Stat(filePath) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + if err == nil { + return nil, errors.Errorf(i18n.T(i18n.ArchClientFileAlreadyExists), archiveFilePath) + } + + file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0660) + if err != nil { + return nil, err + } + + return file, nil +} + +func packageUpload(ctx context.Context, client *httpClient.Handler, uploadUrl string, reader io.Reader) error { + cephResponse, err := client.PutStream(ctx, uploadUrl, reader, httpClient.ContentType("application/gzip")) + if err != nil { + return err + } + if cephResponse.StatusCode != http.StatusCreated { + return errors.New(i18n.T(i18n.BuildDeployUploadPackageFailed)) + } + + return nil +} + +func getValidConfigContent(uxBlocks uxBlock.UxBlocks, workingDir string, zeropsYamlPath string) ([]byte, error) { + workingDir, err := filepath.Abs(workingDir) + if err != nil { + return nil, err + } + + if zeropsYamlPath != "" { + workingDir = filepath.Join(workingDir, zeropsYamlPath) + } + + zeropsYamlPath = filepath.Join(workingDir, ZeropsYamlFileName) + + zeropsYamlStat, err := os.Stat(zeropsYamlPath) + if err != nil { + if os.IsNotExist(err) { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlNotFound, zeropsYamlPath)) + } + return nil, err + } + + uxBlocks.PrintLine(i18n.T(i18n.BuildDeployZeropsYamlFound, zeropsYamlPath)) + + if zeropsYamlStat.Size() == 0 { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlEmpty)) + } + if zeropsYamlStat.Size() > 10*1024 { + return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlTooLarge)) + } + + yamlContent, err := os.ReadFile(zeropsYamlPath) + if err != nil { + return nil, err + } + + return yamlContent, nil +} + +func validateZeropsYamlContent( + ctx context.Context, + restApiClient *zeropsRestApiClient.Handler, + service *entity.Service, + yamlContent []byte, +) error { + resp, err := restApiClient.PostServiceStackZeropsYamlValidation(ctx, body.ZeropsYamlValidation{ + Name: service.Name, + ServiceStackTypeId: service.ServiceTypeId, + ZeropsYaml: types.NewText(string(yamlContent)), + }) + if err != nil { + return err + } + if _, err = resp.Output(); err != nil { + return err + } + + return nil +} diff --git a/src/cmd/serviceStart.go b/src/cmd/serviceStart.go index bbf79b9c..da00e65c 100644 --- a/src/cmd/serviceStart.go +++ b/src/cmd/serviceStart.go @@ -15,6 +15,7 @@ func serviceStartCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceStart)). ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg(), cmdBuilder.OptionalArgLabel("{serviceName | serviceId}")). + Short(i18n.T(i18n.ServiceStartHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { startServiceResponse, err := cmdData.RestApiClient.PutServiceStackStart( ctx, diff --git a/src/cmd/serviceStop.go b/src/cmd/serviceStop.go index f7d65e2e..6e50fe17 100644 --- a/src/cmd/serviceStop.go +++ b/src/cmd/serviceStop.go @@ -16,6 +16,7 @@ func serviceStopCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceStop)). ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). + Short(i18n.T(i18n.ServiceStopHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { stopServiceResponse, err := cmdData.RestApiClient.PutServiceStackStop( ctx, diff --git a/src/cmd/status.go b/src/cmd/status.go index 0a66f8a4..ff547c8e 100644 --- a/src/cmd/status.go +++ b/src/cmd/status.go @@ -9,6 +9,7 @@ func statusCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("status"). Short(i18n.T(i18n.CmdStatus)). + Short(i18n.T(i18n.StatusHelp)). AddChildrenCmd(statusShowDebugLogsCmd()). AddChildrenCmd(statusInfoCmd()) } diff --git a/src/cmd/statusInfo.go b/src/cmd/statusInfo.go index b76e0d41..3d010fdc 100644 --- a/src/cmd/statusInfo.go +++ b/src/cmd/statusInfo.go @@ -16,6 +16,7 @@ func statusInfoCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("info"). Short(i18n.T(i18n.CmdStatusInfo)). + Short(i18n.T(i18n.StatusInfoHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { body := &uxBlock.TableBody{} diff --git a/src/cmd/statusShowDebugLogs.go b/src/cmd/statusShowDebugLogs.go index e083ff3b..5bfdb6e9 100644 --- a/src/cmd/statusShowDebugLogs.go +++ b/src/cmd/statusShowDebugLogs.go @@ -15,6 +15,7 @@ func statusShowDebugLogsCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("show-debug-logs"). Short(i18n.T(i18n.CmdStatusShowDebugLogs)). + Short(i18n.T(i18n.StatusShowDebugLogsHelp)). GuestRunFunc(func(ctx context.Context, cmdData *cmdBuilder.GuestCmdData) error { logFilePath, err := constants.LogFilePath() if err != nil { @@ -32,18 +33,23 @@ func statusShowDebugLogsCmd() *cmdBuilder.Cmd { filesize := stat.Size() if filesize == 0 { - // TODO - janhajek translate - fmt.Println("No logs found") + cmdData.UxBlocks.PrintLine(i18n.T(i18n.DebugLogsNotFound)) return nil } lines := []string{} for { cursor -= 1 - f.Seek(cursor, io.SeekEnd) + _, err = f.Seek(cursor, io.SeekEnd) + if err != nil { + return err + } char := make([]byte, 1) - f.Read(char) + _, err = f.Read(char) + if err != nil { + return err + } if cursor != -1 && (char[0] == 10 || char[0] == 13) { // stop if we find a line if len(lines) > 10 { @@ -55,7 +61,7 @@ func statusShowDebugLogsCmd() *cmdBuilder.Cmd { line = fmt.Sprintf("%s%s", string(char), line) - if cursor == -filesize { // stop if we are at the begining + if cursor == -filesize { // stop if we are at the beginning lines = append([]string{line}, lines...) break } diff --git a/src/cmd/version.go b/src/cmd/version.go index 7242ec13..cc65075b 100644 --- a/src/cmd/version.go +++ b/src/cmd/version.go @@ -15,6 +15,7 @@ func versionCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("version"). Short(i18n.T(i18n.CmdVersion)). + Short(i18n.T(i18n.VersionHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { fmt.Printf("zcli version %s (%s) %s/%s\n", Version, runtime.Version(), runtime.GOOS, runtime.GOARCH) diff --git a/src/cmdBuilder/cmd.go b/src/cmdBuilder/cmd.go index 0cbc3723..b9f5ad99 100644 --- a/src/cmdBuilder/cmd.go +++ b/src/cmdBuilder/cmd.go @@ -34,6 +34,7 @@ type cmdFlag struct { defaultValue interface{} description string hidden bool + shorthand string } func NewCmd() *Cmd { @@ -122,6 +123,12 @@ func HiddenFlag() FlagOption { } } +func ShortHand(shorthand string) FlagOption { + return func(cfg *cmdFlag) { + cfg.shorthand = shorthand + } +} + func (cmd *Cmd) StringFlag(name string, defaultValue string, description string, auxOptions ...FlagOption) *Cmd { return cmd.addFlag(name, defaultValue, description, auxOptions...) } @@ -134,6 +141,11 @@ func (cmd *Cmd) BoolFlag(name string, defaultValue bool, description string, aux return cmd.addFlag(name, defaultValue, description, auxOptions...) } +func (cmd *Cmd) HelpFlag(description string, auxOptions ...FlagOption) *Cmd { + auxOptions = append(auxOptions, ShortHand("h")) + return cmd.addFlag("help", false, description, auxOptions...) +} + func (cmd *Cmd) addFlag(name string, defaultValue interface{}, description string, auxOptions ...FlagOption) *Cmd { cfg := cmdFlag{ name: name, diff --git a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go index 7d2f79f3..b16e5ed8 100644 --- a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go +++ b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go @@ -34,11 +34,11 @@ func (b *CmdBuilder) buildCobraCmd(cmd *Cmd, params *params.Handler) (*cobra.Com for _, flag := range cmd.flags { switch defaultValue := flag.defaultValue.(type) { case string: - params.RegisterString(cobraCmd, flag.name, defaultValue, flag.description) + params.RegisterString(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) case int: - params.RegisterInt(cobraCmd, flag.name, defaultValue, flag.description) + params.RegisterInt(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) case bool: - params.RegisterBool(cobraCmd, flag.name, defaultValue, flag.description) + params.RegisterBool(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) default: panic(fmt.Sprintf("unexpected type %T", flag.defaultValue)) } diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index bfa57258..ff70cc62 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -22,6 +22,7 @@ import ( "github.com/zeropsio/zcli/src/uxBlock" "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/apiError" + "golang.org/x/term" "gopkg.in/yaml.v3" ) @@ -87,16 +88,21 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co return err } + width, _, err := term.GetSize(0) + if err != nil { + width = 100 + } + outputLogger, debugFileLogger := createLoggers(isTerminal, loggerFilePath) - uxBlocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, cancel) + uxBlocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, width, cancel) uxBlocks.PrintDebugLine(fmt.Sprintf("Command: %s", cobraCmd.CommandPath())) defer func() { if err != nil { printError(err, uxBlocks) - err = skipErr + err = errSkipErrorReporting } }() @@ -131,7 +137,6 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co } cmdData := &LoggedUserCmdData{ - GuestCmdData: guestCmdData, } @@ -144,7 +149,6 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co } } return cmd.loggedUserRunFunc(ctx, cmdData) - } return cmd.guestRunFunc(ctx, guestCmdData) @@ -156,10 +160,10 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { var isArray bool for i, arg := range cmd.args { if arg.optional && i != len(cmd.args)-1 { - return nil, errors.Errorf("optional arg %s can be only the last one", arg.name) + return nil, errors.Errorf(i18n.T(i18n.ArgsOnlyOneOptionalAllowed), arg.name) } if arg.isArray && i != len(cmd.args)-1 { - return nil, errors.Errorf("array arg %s can be only the last one", arg.name) + return nil, errors.Errorf(i18n.T(i18n.ArgsOnlyOneArrayAllowed), arg.name) } if !arg.optional { requiredArgsCount++ @@ -168,14 +172,12 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { } if len(args) < requiredArgsCount { - // TODO - janhajek message - return nil, errors.Errorf("expected at least %d arg(s), got %d", requiredArgsCount, len(args)) + return nil, errors.Errorf(i18n.T(i18n.ArgsNotEnoughRequiredArgs), requiredArgsCount, len(args)) } // the last arg is not an array, max number of given args can't be greater than the number of registered args if !isArray && len(args) > len(cmd.args) { - // TODO - janhajek message - return nil, errors.Errorf("expected no more than %d arg(s), got %d", len(cmd.args), len(args)) + return nil, errors.Errorf(i18n.T(i18n.ArgsTooManyArgs), len(cmd.args), len(args)) } argsMap := make(map[string][]string) diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go index 94718841..c7e59bf6 100644 --- a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -29,7 +29,7 @@ var TerminalFlag string // This error needs to be handled here. Simple fmt.Println(err.Error()) is enough. // But with this line, other errors are logged twice. Once here, once in the root command. // So, I added a special error to skip the logging after the root command. -var skipErr = errors.New("skip") +var errSkipErrorReporting = errors.New("skipErrorReporting") func (b *CmdBuilder) CreateAndExecuteRootCobraCmd() error { rootCmd := createRootCommand() @@ -46,7 +46,7 @@ func (b *CmdBuilder) CreateAndExecuteRootCobraCmd() error { err := rootCmd.Execute() if err != nil { - if !errors.Is(err, skipErr) { + if !errors.Is(err, errSkipErrorReporting) { fmt.Println(err.Error()) } } @@ -61,8 +61,6 @@ func createRootCommand() *cobra.Command { SilenceErrors: true, } - // TODO - janhajek add a dynamic help for subcommands - rootCmd.Flags().BoolP("help", "h", false, i18n.T(i18n.DisplayHelp)+i18n.T(i18n.GroupHelp)) rootCmd.PersistentFlags().StringVar(&TerminalFlag, "terminal", "auto", i18n.T(i18n.TerminalFlag)) return rootCmd diff --git a/src/cmdRunner/run.go b/src/cmdRunner/run.go index 7a2644f9..e88dcd8f 100644 --- a/src/cmdRunner/run.go +++ b/src/cmdRunner/run.go @@ -8,34 +8,34 @@ import ( "strings" ) -var IpAlreadySetErr = errors.New("RTNETLINK answers: File exists") -var CannotFindDeviceErr = errors.New(`Cannot find device "wg0"`) -var OperationNotPermitted = errors.New(`Operation not permitted`) +var ErrIpAlreadySet = errors.New("RTNETLINK answers: File exists") +var ErrCannotFindDevice = errors.New(`Cannot find device "wg0"`) +var ErrOperationNotPermitted = errors.New(`Operation not permitted`) type ExecErrInterface interface { error ExitCode() int } -type execErr struct { +type execError struct { cmd *exec.Cmd prev error exitCode int } -func (e execErr) Error() string { +func (e execError) Error() string { return e.cmd.String() + ": " + e.prev.Error() } -func (e execErr) ExitCode() int { +func (e execError) ExitCode() int { return e.exitCode } -func (e execErr) Unwrap() error { +func (e execError) Unwrap() error { return e.prev } -func (e execErr) Is(target error) bool { +func (e execError) Is(target error) bool { return errors.Is(e.prev, target) } @@ -53,7 +53,7 @@ func Run(cmd *exec.Cmd) ([]byte, ExecErrInterface) { exitCode = exitError.ExitCode() } - execError := &execErr{ + execError := &execError{ cmd: cmd, exitCode: exitCode, prev: err, @@ -65,12 +65,12 @@ func Run(cmd *exec.Cmd) ([]byte, ExecErrInterface) { errOutputString := string(errOutput.Bytes()[0 : errOutput.Len()-1]) - if strings.Contains(errOutputString, OperationNotPermitted.Error()) { - execError.prev = OperationNotPermitted + if strings.Contains(errOutputString, ErrOperationNotPermitted.Error()) { + execError.prev = ErrOperationNotPermitted return nil, execError } - for _, e := range []error{IpAlreadySetErr, CannotFindDeviceErr} { + for _, e := range []error{ErrIpAlreadySet, ErrCannotFindDevice} { if errOutputString == e.Error() { execError.prev = e return nil, execError diff --git a/src/cmdRunner/run_test.go b/src/cmdRunner/run_test.go index 167c64e8..4826974a 100644 --- a/src/cmdRunner/run_test.go +++ b/src/cmdRunner/run_test.go @@ -1,22 +1,18 @@ package cmdRunner import ( - "errors" "testing" - . "github.com/onsi/gomega" + "github.com/stretchr/testify/require" ) func TestWrap(t *testing.T) { - RegisterTestingT(t) - - err := &execErr{ - prev: OperationNotPermitted, + err := &execError{ + prev: ErrOperationNotPermitted, exitCode: 1, } - Expect(errors.Is(err, OperationNotPermitted)).To(BeTrue()) - Expect(errors.Is(err, CannotFindDeviceErr)).To(BeFalse()) - Expect(err.ExitCode()).To(Equal(1)) - + require.ErrorIs(t, err, ErrOperationNotPermitted) + require.NotErrorIs(t, err, ErrCannotFindDevice) + require.Equal(t, 1, err.ExitCode()) } diff --git a/src/constants/zerops.go b/src/constants/zerops.go index 990c11a9..cebbf10e 100644 --- a/src/constants/zerops.go +++ b/src/constants/zerops.go @@ -58,8 +58,7 @@ func findFirstWritablePath(paths []pathReceiver) (string, error) { func checkPath(filePath string) error { dir := path.Dir(filePath) - err := os.MkdirAll(dir, 0775) - if err != nil { + if err := os.MkdirAll(dir, 0775); err != nil { return err } diff --git a/src/entity/repository/appVersion.go b/src/entity/repository/appVersion.go index 3b17191e..36e98565 100644 --- a/src/entity/repository/appVersion.go +++ b/src/entity/repository/appVersion.go @@ -15,7 +15,6 @@ func GetAllAppVersionByService( restApiClient *zeropsRestApiClient.Handler, service entity.Service, ) ([]entity.AppVersion, error) { - var searchData []body.EsSearchItem searchData = append(searchData, body.EsSearchItem{ Name: "clientId", diff --git a/src/entity/repository/container.go b/src/entity/repository/container.go index 2f8e5bdc..aa957456 100644 --- a/src/entity/repository/container.go +++ b/src/entity/repository/container.go @@ -46,7 +46,6 @@ func GetAllContainers( } func containerFromEsSearch(esContainer output.EsContainer) entity.Container { - return entity.Container{ ID: esContainer.Id, ClientId: esContainer.ClientId, diff --git a/src/httpClient/handler.go b/src/httpClient/handler.go index 51b9cc14..4003c488 100644 --- a/src/httpClient/handler.go +++ b/src/httpClient/handler.go @@ -49,27 +49,19 @@ type optionConfig struct { headers map[string]string } -func (h *Handler) PutStream(url string, body io.Reader, options ...Option) (Response, error) { - return h.doStream("PUT", url, body, options...) +func (h *Handler) PutStream(ctx context.Context, url string, body io.Reader, options ...Option) (Response, error) { + return h.doStream(ctx, "PUT", url, body, options...) } -func (h *Handler) Put(url string, data []byte, options ...Option) (Response, error) { - return h.do("PUT", url, data, options...) +func (h *Handler) Get(ctx context.Context, url string, options ...Option) (Response, error) { + return h.do(ctx, "GET", url, nil) } -func (h *Handler) Post(url string, data []byte, options ...Option) (Response, error) { - return h.do("POST", url, data, options...) +func (h *Handler) do(ctx context.Context, method string, url string, data []byte, options ...Option) (Response, error) { + return h.doStream(ctx, method, url, bytes.NewReader(data), options...) } -func (h *Handler) Get(url string, options ...Option) (Response, error) { - return h.do("GET", url, nil) -} - -func (h *Handler) do(method string, url string, data []byte, options ...Option) (Response, error) { - return h.doStream(method, url, bytes.NewReader(data), options...) -} - -func (h *Handler) doStream(method string, url string, body io.Reader, options ...Option) (Response, error) { +func (h *Handler) doStream(ctx context.Context, method string, url string, body io.Reader, options ...Option) (Response, error) { cfg := &optionConfig{ headers: map[string]string{ "Content-Type": "application/json", @@ -81,7 +73,7 @@ func (h *Handler) doStream(method string, url string, body io.Reader, options .. } client := &http.Client{Timeout: h.config.HttpTimeout} - req, err := http.NewRequest(method, url, body) + req, err := http.NewRequestWithContext(ctx, method, url, body) if err != nil { return Response{}, err } diff --git a/src/i18n/en.go b/src/i18n/en.go index 3b96d7c2..9ca8d603 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -2,31 +2,39 @@ package i18n var en = map[string]string{ // help - DisplayHelp: "Displays help for ", - GroupHelp: "any command.", - DeployHelp: "the deploy command.", - LogShowHelp: "the log show command.", - LoginHelp: "the login command.", - ProjectHelp: "the project command.", - ProjectStartHelp: "the project start command.", - ProjectStopHelp: "the project stop command.", - ProjectListHelp: "the project list command.", - ScopeHelp: "the scope command.", - ScopeProjectHelp: "the scope project command.", - ScopeServiceHelp: "the scope project command.", - ScopeResetHelp: "the scope reset command.", - ProjectDeleteHelp: "the project delete command.", - ProjectImportHelp: "the project import command.", - PushHelp: "the push command.", - RegionListHelp: "the region list command.", - ServiceStartHelp: "the service start command.", - ServiceStopHelp: "the service stop command.", - ServiceImportHelp: "the service import command.", - ServiceDeleteHelp: "the service delete command.", - ServiceLogHelp: "the service log command.", - VersionHelp: "the version command.", - BucketCreateHelp: "the bucket create command.", - BucketDeleteHelp: "the bucket delete command.", + DisplayHelp: "Displays help for ", + GroupHelp: "any command.", + DeployHelp: "the deploy command.", + LogShowHelp: "the log show command.", + LoginHelp: "the login command.", + ProjectHelp: "the project command.", + ProjectStartHelp: "the project start command.", + ProjectStopHelp: "the project stop command.", + ProjectListHelp: "the project list command.", + ScopeHelp: "the scope command.", + ScopeProjectHelp: "the scope project command.", + ScopeServiceHelp: "the scope project command.", + ScopeResetHelp: "the scope reset command.", + ProjectDeleteHelp: "the project delete command.", + ProjectImportHelp: "the project import command.", + ProjectServiceImportHelp: "the project service import command.", + ServiceHelp: "the service command.", + PushHelp: "the push command.", + RegionListHelp: "the region list command.", + ServiceStartHelp: "the service start command.", + ServiceStopHelp: "the service stop command.", + ServiceImportHelp: "the service import command.", + ServiceDeleteHelp: "the service delete command.", + ServiceLogHelp: "the service log command.", + ServiceDeployHelp: "the service deploy command.", + ServiceListHelp: "the service list command.", + ServicePushHelp: "the service push command.", + StatusHelp: "the status command.", + StatusInfoHelp: "the status info command.", + StatusShowDebugLogsHelp: "the status show debug logs command.", + VersionHelp: "the version command.", + BucketCreateHelp: "the bucket create command.", + BucketDeleteHelp: "the bucket delete command.", // cmd short CmdDeployDesc: "Deploys your application to Zerops.", @@ -84,24 +92,14 @@ var en = map[string]string{ LogFollowFlag: "If set, zCLI will continuously poll for new log messages. By default, the command will exit\nonce there are no more logs to display. To exit from this mode, use Control-C.", LogFormatFlag: "The format of returned log messages. Following formats are supported: \nFULL: This is the default format. Messages will be returned in the complete Syslog format. \nSHORT: Returns only timestamp and log message.\nJSON: Messages will be returned as one JSON object.\nJSONSTREAM: Messages will be returned as stream of JSON objects.", LogFormatTemplateFlag: "Set a custom log format. Can be used only with --format=FULL.\nExample: --formatTemplate=\"{{.timestamp}} {{.severity}} {{.facility}} {{.message}}\".\nSupports standard GoLang template format and functions.", - QuietModeFlag: "In terminal mode some operations need to be confirmed. 0 = Everything needs to be confirmed, 1 = Non-destructive operations need to be confirmed, 2 = Quiet mode, nothing needs to be confirmed. Default value is 0.", TerminalFlag: "If enabled provides a rich UI to communicate with a user. Possible values: auto, enabled, disabled. Default value is auto.", LogFilePathFlag: "Path to a log file. Default value: %s.", ConfirmFlag: "If set, zCLI will not ask for confirmation of destructive operations.", ServiceIdFlag: "If you have access to more than one service, you must specify the service ID for which the\ncommand is to be executed.", ProjectIdFlag: "If you have access to more than one project, you must specify the project ID for which the\ncommand is to be executed.", - // prompt - PromptEnterZeropsServiceName: "Enter hostname of zerops service", - PromptName: "name", - PromptInvalidInput: "Invalid input.", - PromptInvalidHostname: "Name contains invalid characters.", - // process - ProcessInvalidState: "last command has finished with error, identifier for communication with our support: %s", - ProcessInvalidStateProcess: "process finished with error, identifier for communication with our support:", - ProcessStart: "process started", - ProcessEnd: "process finished", + ProcessInvalidState: "last command has finished with error, identifier for communication with our support: %s", // archiveClient ArchClientWorkingDirectory: "working directory: %s", @@ -111,57 +109,45 @@ var en = map[string]string{ ArchClientFileAlreadyExists: "file [%s] already exists", // login - LoginSuccess: "You are logged as %s <%s>", - LoginIncorrectToken: "Incorrect token, login failed", - RegionUrl: "zerops region file url", + LoginSuccess: "You are logged as %s <%s>", // region - RegionNotFound: "Selected region %s not found", - - // client ID - MultipleClientIds: "you have assigned multiple client IDs, please use the --clientId flag", - AvailableClientIds: "your client IDs are: ", - MissingClientId: "no client ID found four your account", + RegionNotFound: "Selected region %s not found", + RegionTableColumnName: "Name", // import - YamlCheck: "yaml file check started", - ImportYamlOk: "Yaml file was checked", - ImportYamlEmpty: "Config file import yaml is empty", - ImportYamlTooLarge: "Max. size of import yaml is 100 KB", - ImportYamlFound: "Import yaml found", - ImportYamlNotFound: "Import yaml not found", - ImportYamlCorrupted: "Import yaml corrupted", - ServiceCount: "Number of services to be added: %d", - QueuedProcesses: "Queued processes: %d", - CoreServices: "Core services activation started", - ReadyToImportServices: "Ready to import services", + ImportYamlOk: "Yaml file was checked", + ImportYamlEmpty: "Config file import yaml is empty", + ImportYamlTooLarge: "Max. size of import yaml is 100 KB", + ImportYamlFound: "Import yaml found", + ImportYamlNotFound: "Import yaml not found", + ImportYamlCorrupted: "Import yaml corrupted", + ServiceCount: "Number of services to be added: %d", + QueuedProcesses: "Queued processes: %d", + CoreServices: "Core services activation started", // delete cmd DeleteCanceledByUser: "delete command canceled by user", // project + service - ProjectWrongId: "Please, provide correct project ID.", - ProjectsWithSameName: "found multiple projects with the same name", - AvailableProjectIds: "available project IDs are: ", - ProjectNameOrIdEmpty: "project name or ID must be filled", - ProjectDeleteConfirm: "Project %s will be deleted? \n Are you sure?", - ServiceNameIsEmpty: "Service name must be filled", - ServiceDeleteConfirm: "Service %s will be deleted? \n Are you sure?", - ProcessInit: " command initialized", - ProjectStarting: "Project is being started", - ProjectStarted: "Project was started", - ProjectStopping: "Project is begin stopped", - ProjectStopped: "Project was stopped", - ProjectDeleting: "Project is being deleted", - ProjectDeleted: "Project was deleted", - ServiceStarting: "Service is being started", - ServiceStarted: "Service was started", - ServiceStopping: "Service is being stopped", - ServiceStopped: "Service was stopped", - ServiceDeleting: "Service is being deleted", - ServiceDeleted: "Service was deleted", - ProjectImported: "project imported", - ServiceImported: "service(s) imported", + ProjectDeleteConfirm: "Project %s will be deleted? \n Are you sure?", + ServiceDeleteConfirm: "Service %s will be deleted? \n Are you sure?", + ProjectStarting: "Project is being started", + ProjectStarted: "Project was started", + ProjectStopping: "Project is begin stopped", + ProjectStopped: "Project was stopped", + ProjectDeleting: "Project is being deleted", + ProjectDeleted: "Project was deleted", + ServiceStarting: "Service is being started", + ServiceStarted: "Service was started", + ServiceStopping: "Service is being stopped", + ServiceStopped: "Service was stopped", + ServiceDeleting: "Service is being deleted", + ServiceDeleted: "Service was deleted", + ProjectImported: "project imported", + ServiceImported: "service(s) imported", + + // service logs LogLimitInvalid: "Invalid --limit value. Allowed interval is <1;1000>", LogMinSeverityInvalid: "Invalid --minimumSeverity value.", LogMinSeverityStringLimitErr: "Allowed values are EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFORMATIONAL, DEBUG.", @@ -188,7 +174,6 @@ var en = map[string]string{ // deploy DeployHintPush: "To build your application in Zerops, use the zcli push command instead.", - BuildDeployServiceStatus: "service status: %s", BuildDeployCreatingPackageStart: "creating package", BuildDeployCreatingPackageDone: "package created", BuildDeployPackageSavedInto: "package file saved into: %s", @@ -201,7 +186,7 @@ var en = map[string]string{ BuildDeployZeropsYamlFound: "File zerops.yml found. Path: %s.", BuildDeployZeropsYamlNotFound: "File zerops.yml not found. Expected path: %s.", - // S3 + // s3 BucketGenericXAmzAcl: "Defines one of predefined grants, known as canned ACLs.\nValid values are: private, public-read, public-read-write, authenticated-read.", BucketGenericXAmzAclInvalid: "Invalid --x-amz-acl value. Allowed values are: private, public-read, public-read-write, authenticated-read.", BucketGenericOnlyForObjectStorage: "This command can be used on object storage services only.", @@ -223,21 +208,27 @@ var en = map[string]string{ BucketS3RequestFailed: "S3 API request failed: %s", BucketS3BucketAlreadyExists: "The bucket name already exists under a different object storage user. Set a different bucket name.", - // Status info + // status info StatusInfoCliDataFilePath: "Zerops CLI data file path", StatusInfoLogFilePath: "Zerops CLI log file path", - // Logger - LoggerUnableToOpenLogFileWarning: "Failed to open a log file, used path: %s. Try to use --log-file-path flag.\n", + // debug logs + DebugLogsNotFound: "Debug logs not found", - // generic - UnauthenticatedUser: `unauthenticated user, login before proceeding with this command -zcli login {token} -more info: https://docs.zerops.io/documentation/cli/authorization.html`, + //////////// + // global // + //////////// + + // args + ArgsOnlyOneOptionalAllowed: "optional arg %s can be only the last one", + ArgsOnlyOneArrayAllowed: "array arg %s can be only the last one", + ArgsNotEnoughRequiredArgs: "expected at least %d arg(s), got %d", + ArgsTooManyArgs: "expected no more than %d arg(s), got %d", - HintChangeRegion: "hint: try to change your region (you can list available regions using `zcli region list`)", + // logger + LoggerUnableToOpenLogFileWarning: "Failed to open a log file, used path: %s. Try to use --log-file-path flag.\n", - // UX helpers + // ux helpers ProjectSelectorListEmpty: "You don't have any projects yet. Create a new project using `zcli project import` command.", ProjectSelectorPrompt: "Please, select a project", ProjectSelectorOutOfRangeError: "We couldn't find a project with the index you entered. Please, try again or contact our support team.", @@ -250,14 +241,17 @@ more info: https://docs.zerops.io/documentation/cli/authorization.html`, SelectorAllowedOnlyInTerminal: "Interactive selection can be used only in terminal mode. Use command flags to specify missing parameters.", PromptAllowedOnlyInTerminal: "Interactive prompt can be used only in terminal mode. Use --confirm=true flag to confirm it", - // Global - SelectedProject: "Selected project: %s", - SelectedService: "Selected service: %s", - ScopedProject: "Scoped project: %s", - ScopedProjectNotFound: "Scoped project wasn't found, Select a different project using `zcli scope project` command.", + UnauthenticatedUser: `unauthenticated user, login before proceeding with this command +zcli login {token} +more info: https://docs.zerops.io/documentation/cli/authorization.html`, - ServiceIdInvalidFormat: "Invalid format of service ID. ID must have 22 characters.", - ServiceNotFound: "Service [%s] wasn't found", + // scope + SelectedProject: "Selected project: %s", + SelectedService: "Selected service: %s", + ScopedProject: "Scoped project: %s", + ScopedProjectNotFound: "Scoped project wasn't found, Select a different project using `zcli scope project` command.", + PreviouslyScopedProject: "Previously scoped project: %s", + ScopeReset: "Scope was reset", DestructiveOperationConfirmationFailed: "You have to confirm a destructive operation.", } diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index a5cc24b3..3d8f509a 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -15,31 +15,39 @@ func T(textConst string, args ...interface{}) string { const ( // help - DisplayHelp = "DisplayHelp" - GroupHelp = "GroupHelp" - DeployHelp = "DeployHelp" - LogShowHelp = "LogShowHelp" - LoginHelp = "LoginHelp" - ProjectHelp = "ProjectHelp" - ProjectStartHelp = "ProjectStartHelp" - ProjectStopHelp = "ProjectStopHelp" - ProjectListHelp = "ProjectListHelp" - ScopeHelp = "ScopeHelp" - ScopeProjectHelp = "ScopeProjectHelp" - ScopeServiceHelp = "ScopeServiceHelp" - ScopeResetHelp = "ScopeResetHelp" - ProjectDeleteHelp = "ProjectDeleteHelp" - ProjectImportHelp = "ProjectImportHelp" - PushHelp = "PushHelp" - RegionListHelp = "RegionListHelp" - ServiceStartHelp = "ServiceStartHelp" - ServiceStopHelp = "ServiceStopHelp" - ServiceImportHelp = "ServiceImportHelp" - ServiceDeleteHelp = "ServiceDeleteHelp" - ServiceLogHelp = "ServiceLogHelp" - VersionHelp = "VersionHelp" - BucketCreateHelp = "BucketCreateHelp" - BucketDeleteHelp = "BucketDeleteHelp" + DisplayHelp = "DisplayHelp" + GroupHelp = "GroupHelp" + DeployHelp = "DeployHelp" + LogShowHelp = "LogShowHelp" + LoginHelp = "LoginHelp" + ProjectHelp = "ProjectHelp" + ProjectStartHelp = "ProjectStartHelp" + ProjectStopHelp = "ProjectStopHelp" + ProjectListHelp = "ProjectListHelp" + ScopeHelp = "ScopeHelp" + ScopeProjectHelp = "ScopeProjectHelp" + ScopeServiceHelp = "ScopeServiceHelp" + ScopeResetHelp = "ScopeResetHelp" + ProjectDeleteHelp = "ProjectDeleteHelp" + ProjectImportHelp = "ProjectImportHelp" + ProjectServiceImportHelp = "ProjectServiceImportHelp" + ServiceHelp = "ServiceHelp" + PushHelp = "PushHelp" + RegionListHelp = "RegionListHelp" + ServiceStartHelp = "ServiceStartHelp" + ServiceStopHelp = "ServiceStopHelp" + ServiceImportHelp = "ServiceImportHelp" + ServiceDeleteHelp = "ServiceDeleteHelp" + ServiceLogHelp = "ServiceLogHelp" + ServiceDeployHelp = "ServiceDeployHelp" + ServiceListHelp = "ServiceListHelp" + ServicePushHelp = "ServicePushHelp" + StatusHelp = "StatusHelp" + StatusInfoHelp = "StatusInfoHelp" + StatusShowDebugLogsHelp = "StatusShowDebugLogsHelp" + VersionHelp = "VersionHelp" + BucketCreateHelp = "BucketCreateHelp" + BucketDeleteHelp = "BucketDeleteHelp" // cmd short CmdDeployDesc = "CmdDeployDesc" @@ -97,7 +105,6 @@ const ( LogShowBuildFlag = "LogShowBuildFlag" LogFormatFlag = "LogFormatFlag" LogFormatTemplateFlag = "LogFormatTemplateFlag" - QuietModeFlag = "QuietModeFlag" TerminalFlag = "TerminalFlag" LogFilePathFlag = "LogFilePathFlag" ConfirmFlag = "ConfirmFlag" @@ -129,7 +136,8 @@ const ( RegionUrl = "RegionUrl" // region - RegionNotFound = "RegionNotFound" + RegionNotFound = "RegionNotFound" + RegionTableColumnName = "RegionTableColumnName" // client ID MultipleClientIds = "MultipleClientIds" @@ -153,28 +161,30 @@ const ( DeleteCanceledByUser = "DeleteCanceledByUser" // project + service - ProjectWrongId = "ProjectWrongId" - ProjectsWithSameName = "ProjectsWithSameName" - AvailableProjectIds = "AvailableProjectIds" - ProjectNameOrIdEmpty = "ProjectNameOrIdEmpty" - ProjectDeleteConfirm = "ProjectDeleteConfirm" - ServiceNameIsEmpty = "ServiceNameIsEmpty" - ServiceDeleteConfirm = "ServiceDeleteConfirm" - ProcessInit = "ProcessInit" - ProjectStarting = "ProjectStarting" - ProjectStarted = "ProjectStarted" - ProjectStopping = "ProjectStopping" - ProjectStopped = "ProjectStopped" - ProjectDeleting = "ProjectDeleting" - ProjectDeleted = "ProjectDeleted" - ServiceStarting = "ServiceStarting" - ServiceStarted = "ServiceStarted" - ServiceStopping = "ServiceStopping" - ServiceStopped = "ServiceStopped" - ServiceDeleting = "ServiceDeleting" - ServiceDeleted = "ServiceDeleted" - ProjectImported = "ProjectImported" - ServiceImported = "ServiceImported" + ProjectWrongId = "ProjectWrongId" + ProjectsWithSameName = "ProjectsWithSameName" + AvailableProjectIds = "AvailableProjectIds" + ProjectNameOrIdEmpty = "ProjectNameOrIdEmpty" + ProjectDeleteConfirm = "ProjectDeleteConfirm" + ServiceNameIsEmpty = "ServiceNameIsEmpty" + ServiceDeleteConfirm = "ServiceDeleteConfirm" + ProcessInit = "ProcessInit" + ProjectStarting = "ProjectStarting" + ProjectStarted = "ProjectStarted" + ProjectStopping = "ProjectStopping" + ProjectStopped = "ProjectStopped" + ProjectDeleting = "ProjectDeleting" + ProjectDeleted = "ProjectDeleted" + ServiceStarting = "ServiceStarting" + ServiceStarted = "ServiceStarted" + ServiceStopping = "ServiceStopping" + ServiceStopped = "ServiceStopped" + ServiceDeleting = "ServiceDeleting" + ServiceDeleted = "ServiceDeleted" + ProjectImported = "ProjectImported" + ServiceImported = "ServiceImported" + + // service logs LogLimitInvalid = "LogLimitInvalid" LogMinSeverityInvalid = "LogMinSeverityInvalid" LogMinSeverityStringLimitErr = "LogMinSeverityStringLimitErr" @@ -214,7 +224,7 @@ const ( BuildDeployZeropsYamlFound = "BuildDeployZeropsYamlFound" BuildDeployZeropsYamlNotFound = "BuildDeployZeropsYamlNotFound" - // S3 + // s3 BucketGenericXAmzAcl = "BucketGenericXAmzAcl" BucketGenericXAmzAclInvalid = "BucketGenericXAmzAclInvalid" BucketGenericOnlyForObjectStorage = "BucketGenericOnlyForObjectStorage" @@ -236,19 +246,27 @@ const ( BucketS3RequestFailed = "RequestFailed" BucketS3BucketAlreadyExists = "BucketAlreadyExists" - // Status info + // status info StatusInfoCliDataFilePath = "StatusInfoCliDataFilePath" StatusInfoLogFilePath = "StatusInfoLogFilePath" - // Logger - LoggerUnableToOpenLogFileWarning = "LoggerUnableToOpenLogFileWarning" + // debug logs + DebugLogsNotFound = "DebugLogsNotFound" - // generic - UnauthenticatedUser = "UnauthenticatedUser" + //////////// + // global // + //////////// - HintChangeRegion = "HintChangeRegion" + // args + ArgsOnlyOneOptionalAllowed = "ArgsOnlyOneOptionalAllowed" + ArgsOnlyOneArrayAllowed = "ArgsOnlyOneArrayAllowed" + ArgsNotEnoughRequiredArgs = "ArgsNotEnoughRequiredArgs" + ArgsTooManyArgs = "ArgsTooManyArgs" - // UX helpers + // logger + LoggerUnableToOpenLogFileWarning = "LoggerUnableToOpenLogFileWarning" + + // ux helpers ProjectSelectorListEmpty = "ProjectSelectorListEmpty" ProjectSelectorPrompt = "ProjectSelectorPrompt" ProjectSelectorOutOfRangeError = "ProjectSelectorOutOfRangeError" @@ -261,18 +279,22 @@ const ( SelectorAllowedOnlyInTerminal = "SelectorAllowedOnlyInTerminal" PromptAllowedOnlyInTerminal = "PromptAllowedOnlyInTerminal" - // Global - SelectedProject = "SelectedProject" - SelectedService = "SelectedService" - ScopedProject = "ScopedProject" - ScopedProjectNotFound = "ScopedProjectNotFound" - ScopedServiceNotFound = "ScopedServiceNotFound" + UnauthenticatedUser = "UnauthenticatedUser" + + // scope + SelectedProject = "SelectedProject" + SelectedService = "SelectedService" + ScopedProject = "ScopedProject" + ScopedProjectNotFound = "ScopedProjectNotFound" + PreviouslyScopedProject = "PreviouslyScopedProject" + ScopeReset = "ScopeReset" + + DestructiveOperationConfirmationFailed = "DestructiveOperationConfirmationFailed" + HintChangeRegion = "HintChangeRegion" + ScopedServiceNotFound = "ScopedServiceNotFound" ProjectIdInvalidFormat = "ProjectIdInvalidFormat" ProjectNotFound = "ProjectNotFound" - ServiceIdInvalidFormat = "ServiceIdInvalidFormat" ServiceNotFound = "ServiceNotFound" - - DestructiveOperationConfirmationFailed = "DestructiveOperationConfirmationFailed" ) diff --git a/src/logger/handler.go b/src/logger/handler.go index 8df325c1..2ea572f1 100644 --- a/src/logger/handler.go +++ b/src/logger/handler.go @@ -36,7 +36,6 @@ func NewOutputLogger(config OutputConfig) *Handler { return &Handler{ logrus: l, } - } type DebugFileConfig struct { @@ -66,7 +65,6 @@ func NewDebugFileLogger(config DebugFileConfig) *Handler { return &Handler{ logrus: l, } - } func (h *Handler) Info(a ...interface{}) { diff --git a/src/params/handler.go b/src/params/handler.go index 0171ab7c..2679654e 100644 --- a/src/params/handler.go +++ b/src/params/handler.go @@ -26,52 +26,49 @@ func (h *Handler) getCmdId(cmd *cobra.Command, name string) string { return cmd.Use + name } -func (h *Handler) RegisterString(cmd *cobra.Command, name, defaultValue, description string) { +func (h *Handler) RegisterString(cmd *cobra.Command, name, shorthand, defaultValue, description string) { var paramValue string - cmd.Flags().StringVar(¶mValue, name, defaultValue, description) + cmd.Flags().StringVarP(¶mValue, name, shorthand, defaultValue, description) h.params[h.getCmdId(cmd, name)] = func() *string { if cmd.Flags().Lookup(name).Changed { return ¶mValue } - if h.viper.GetString(name) != "" { - v := h.viper.GetString(name) - return &v + if val := h.viper.GetString(toSnakeCase(name)); val != "" { + return &val } return ¶mValue } } -func (h *Handler) RegisterBool(cmd *cobra.Command, name string, defaultValue bool, description string) { +func (h *Handler) RegisterBool(cmd *cobra.Command, name, shorthand string, defaultValue bool, description string) { var paramValue bool - cmd.Flags().BoolVar(¶mValue, name, defaultValue, description) + cmd.Flags().BoolVarP(¶mValue, name, shorthand, defaultValue, description) h.params[h.getCmdId(cmd, name)] = func() *bool { if cmd.Flags().Lookup(name).Changed { return ¶mValue } - if h.viper.GetBool(name) != false { - v := h.viper.GetBool(name) - return &v + if val := h.viper.GetBool(toSnakeCase(name)); val { + return &val } return ¶mValue } } -func (h *Handler) RegisterInt(cmd *cobra.Command, name string, defaultValue int, description string) { +func (h *Handler) RegisterInt(cmd *cobra.Command, name, shorthand string, defaultValue int, description string) { var paramValue int - cmd.Flags().IntVar(¶mValue, name, defaultValue, description) + cmd.Flags().IntVarP(¶mValue, name, shorthand, defaultValue, description) h.params[h.getCmdId(cmd, name)] = func() *int { if cmd.Flags().Lookup(name).Changed { return ¶mValue } - if h.viper.GetInt(name) != 0 { - v := h.viper.GetInt(name) - return &v + if val := h.viper.GetInt(toSnakeCase(name)); val != 0 { + return &val } return ¶mValue } @@ -131,3 +128,14 @@ func (h *Handler) InitViper() error { return nil } + +func toSnakeCase(flagName string) string { + var result string + for i, r := range flagName { + if i > 0 && r >= 'A' && r <= 'Z' { + result += "_" + } + result += string(r) + } + return result +} diff --git a/src/region/region.go b/src/region/region.go index 65471030..70f234aa 100644 --- a/src/region/region.go +++ b/src/region/region.go @@ -1,6 +1,7 @@ package region import ( + "context" "encoding/json" "sort" @@ -27,8 +28,8 @@ func New(client *httpClient.Handler) *Handler { } } -func (h *Handler) RetrieveAllFromURL(regionURL string) ([]Data, error) { - resp, err := h.client.Get(regionURL) +func (h *Handler) RetrieveAllFromURL(ctx context.Context, regionURL string) ([]Data, error) { + resp, err := h.client.Get(ctx, regionURL) if err != nil { return nil, err } diff --git a/src/serviceLogs/handler_checkInputValues.go b/src/serviceLogs/handler_checkInputValues.go index 6e2cd282..1e7b1e48 100644 --- a/src/serviceLogs/handler_checkInputValues.go +++ b/src/serviceLogs/handler_checkInputValues.go @@ -1,7 +1,6 @@ package serviceLogs import ( - "fmt" "html/template" "strconv" "strings" @@ -79,9 +78,9 @@ func (h *Handler) getMinSeverity(config RunConfig) (intVal int, err error) { } _, err = strconv.Atoi(ms) if err != nil { - return 1, fmt.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityStringLimitErr)) + return 1, errors.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityStringLimitErr)) } - return 1, fmt.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityNumLimitErr)) + return 1, errors.Errorf("%s %s", i18n.T(i18n.LogMinSeverityInvalid), i18n.T(i18n.LogMinSeverityNumLimitErr)) } // getFacility returns facility number based on msgType @@ -118,7 +117,7 @@ func (h *Handler) getFormat(config RunConfig) (string, string, error) { // e.g. --formatTemplate="{{.timestamp}} {{.priority}} {{.facility}} {{.message}}" func (h *Handler) checkFormat(ft string) (string, error) { if err := validateTemplate(ft); err != nil { - return "", fmt.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), err) + return "", errors.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), err) } return ft, nil } diff --git a/src/serviceLogs/handler_formatByRfc.go b/src/serviceLogs/handler_formatByRfc.go index 0edae025..da10ef94 100644 --- a/src/serviceLogs/handler_formatByRfc.go +++ b/src/serviceLogs/handler_formatByRfc.go @@ -19,8 +19,8 @@ import ( "time" ) -func getFullByRfc(logData []Data, RFC string) { - if RFC == RFC3164 { +func getFullByRfc(logData []Data, rfc string) { + if rfc == RFC3164 { for _, data := range logData { fmt.Printf("<%d>%s %s %s: %s\n", data.Priority, @@ -47,8 +47,7 @@ func getFullByRfc(logData []Data, RFC string) { // add missing 0 to have the same length for all timestamps func fixTimestamp(timestamp string) string { - missing := 27 - len(timestamp) - if missing == 0 { + if 27-len(timestamp) == 0 { return timestamp } splitVal := strings.Split(timestamp, ".") @@ -64,7 +63,7 @@ func rfc3164TimeFormat(timestamp string) string { layout := "2006-01-02T15:04:05.000000Z" timeStamp, err := time.Parse(layout, timestamp) if err != nil { - fmt.Println(err) + return err.Error() } return timeStamp.Format("Jan 02 15:04:05") } diff --git a/src/serviceLogs/handler_formatByTemplate.go b/src/serviceLogs/handler_formatByTemplate.go index 0536fc3c..8ccfd762 100644 --- a/src/serviceLogs/handler_formatByTemplate.go +++ b/src/serviceLogs/handler_formatByTemplate.go @@ -6,6 +6,7 @@ import ( "strings" "text/template" + "github.com/pkg/errors" "golang.org/x/text/cases" "golang.org/x/text/language" @@ -20,7 +21,7 @@ func getFullWithTemplate(logData []Data, formatTemplate string) error { for _, o := range logData { err := formatDataByTemplate(o, ft) if err != nil { - return fmt.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), err) + return errors.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), err) } } return nil @@ -46,7 +47,7 @@ func testTokens(tokens []string) error { // if any `{` characters are left, it means the items were not split by correctly rmLeft := strings.Replace(token, "{", "", 2) if strings.Contains(rmLeft, "{") { - return fmt.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), i18n.T(i18n.LogFormatTemplateNoSpace)) + return errors.Errorf("%s %s", i18n.T(i18n.LogFormatTemplateInvalid), i18n.T(i18n.LogFormatTemplateNoSpace)) } } return nil diff --git a/src/serviceLogs/handler_formatLogs.go b/src/serviceLogs/handler_formatLogs.go index f7409549..357ef51b 100644 --- a/src/serviceLogs/handler_formatLogs.go +++ b/src/serviceLogs/handler_formatLogs.go @@ -13,7 +13,8 @@ func parseResponseByFormat(jsonData Response, format, formatTemplate, mode strin logs = reverseLogs(logs) } - if format == FULL { + switch format { + case FULL: if formatTemplate != "" { if err = getFullWithTemplate(logs, formatTemplate); err != nil { return err @@ -24,11 +25,11 @@ func parseResponseByFormat(jsonData Response, format, formatTemplate, mode strin getFullByRfc(logs, RFC5424) return nil } - } else if format == SHORT { + case SHORT: for _, o := range logs { fmt.Printf("%v %s \n", o.Timestamp, o.Content) } - } else if format == JSONSTREAM { + case JSONSTREAM: for _, o := range logs { val, err := json.Marshal(o) if err != nil { @@ -36,7 +37,7 @@ func parseResponseByFormat(jsonData Response, format, formatTemplate, mode strin } fmt.Println(string(val)) } - } else { + default: val, err := json.Marshal(logs) if err != nil { return err diff --git a/src/serviceLogs/handler_getServiceLogUrl.go b/src/serviceLogs/handler_getServiceLogUrl.go index 34e5d098..b94a3a0d 100644 --- a/src/serviceLogs/handler_getServiceLogUrl.go +++ b/src/serviceLogs/handler_getServiceLogUrl.go @@ -2,9 +2,9 @@ package serviceLogs import ( "context" - "fmt" "strings" + "github.com/pkg/errors" "github.com/zeropsio/zerops-go/dto/output" "github.com/zeropsio/zcli/src/i18n" @@ -20,7 +20,7 @@ func (h *Handler) getServiceLogResData(ctx context.Context, projectId uuid.Proje resOutput, err := response.Output() if err != nil { - return "", "", fmt.Errorf("%s %v", i18n.T(i18n.LogAccessFailed), err) + return "", "", errors.Errorf("%s %v", i18n.T(i18n.LogAccessFailed), err) } method, url := getLogRequestData(resOutput) return method, url, nil diff --git a/src/serviceLogs/handler_ws.go b/src/serviceLogs/handler_ws.go index 473a40da..2bd13751 100644 --- a/src/serviceLogs/handler_ws.go +++ b/src/serviceLogs/handler_ws.go @@ -9,6 +9,7 @@ import ( "time" "github.com/gorilla/websocket" + "github.com/pkg/errors" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -28,7 +29,7 @@ func (h *Handler) getLogStream( conn, reps, err := websocket.DefaultDialer.Dial(url, nil) if err != nil { - return fmt.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) + return errors.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) } defer reps.Body.Close() defer conn.Close() @@ -44,7 +45,10 @@ func (h *Handler) getLogStream( case <-done: // if interrupted by user if ctx.Err() != nil { - return nil + if errors.Is(ctx.Err(), context.Canceled) { + return nil + } + return err } // otherwise try to reconnect the websocket err := h.printLogs(ctx, inputs, projectId, serviceId, containerId) @@ -90,7 +94,7 @@ func (h *Handler) receiveHandler(connection *websocket.Conn, format string, done } finishedByUser := strings.Contains(err.Error(), "use of closed network connection") if !finishedByUser { - errMsg := fmt.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) + errMsg := errors.Errorf("%s %s\n", i18n.T(i18n.LogReadingFailed), err.Error()) fmt.Println(errMsg) } return @@ -104,7 +108,7 @@ func (h *Handler) printStreamLog(data []byte, format string) { jsonData, _ := parseResponse(data) // only if there is a new message coming if len(jsonData.Items) > 0 { - //update last msg ID for ws reconnection + // update last msg ID for ws reconnection h.lastMsgId = jsonData.Items[len(jsonData.Items)-1].Id err := parseResponseByFormat(jsonData, format, "", STREAM) if err != nil { diff --git a/src/storage/handler_test.go b/src/storage/handler_test.go index 04e7bd8c..cdbf17f8 100644 --- a/src/storage/handler_test.go +++ b/src/storage/handler_test.go @@ -4,12 +4,10 @@ import ( "os" "testing" - . "github.com/onsi/gomega" + "github.com/stretchr/testify/require" ) func TestStorage(t *testing.T) { - RegisterTestingT(t) - type dataObject struct { Param string } @@ -18,11 +16,11 @@ func TestStorage(t *testing.T) { storage, err := New[dataObject](Config{ FilePath: "./test", }) - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) { d := storage.Data() - Expect(d.Param).To(Equal("")) + require.Equal(t, "", d.Param) } { @@ -30,8 +28,8 @@ func TestStorage(t *testing.T) { data.Param = "value" return data }) - Expect(err).ShouldNot(HaveOccurred()) - Expect(d.Param).To(Equal("value")) + require.NoError(t, err) + require.Equal(t, "value", d.Param) } } @@ -39,13 +37,12 @@ func TestStorage(t *testing.T) { storage, err := New[dataObject](Config{ FilePath: "./test", }) - Expect(err).ShouldNot(HaveOccurred()) + require.NoError(t, err) d := storage.Data() - Expect(d.Param).To(Equal("value")) + require.Equal(t, "value", d.Param) } err := os.Remove("./test") - Expect(err).ShouldNot(HaveOccurred()) - + require.NoError(t, err) } diff --git a/src/uxBlock/blocks.go b/src/uxBlock/blocks.go index b8f9111e..e2b4663d 100644 --- a/src/uxBlock/blocks.go +++ b/src/uxBlock/blocks.go @@ -28,9 +28,10 @@ type UxBlocks interface { } type uxBlocks struct { - isTerminal bool outputLogger logger.Logger debugFileLogger logger.Logger + isTerminal bool + terminalWidth int // ctxCancel is used to cancel the context of the command. // Bubbles package that we use to render graphic components steals the signal handler. @@ -44,6 +45,7 @@ func NewBlock( outputLogger logger.Logger, debugFileLogger logger.Logger, isTerminal bool, + terminalWidth int, ctxCancel context.CancelFunc, ) *uxBlocks { // safety check @@ -55,6 +57,7 @@ func NewBlock( outputLogger: outputLogger, debugFileLogger: debugFileLogger, isTerminal: isTerminal, + terminalWidth: terminalWidth, ctxCancel: ctxCancel, } } diff --git a/src/uxBlock/prompt.go b/src/uxBlock/prompt.go index c0b8fe7e..1f413468 100644 --- a/src/uxBlock/prompt.go +++ b/src/uxBlock/prompt.go @@ -37,8 +37,8 @@ func (b *uxBlocks) Prompt( choices: choices, } p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) - _, err := p.Run() - if err != nil { + + if _, err := p.Run(); err != nil { return 0, err } @@ -67,7 +67,6 @@ func (m *promptModel) Init() tea.Cmd { func (m *promptModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - case "ctrl+c": m.canceled = true return m, tea.Quit diff --git a/src/uxBlock/select.go b/src/uxBlock/select.go index 4818fd9d..d3f6d350 100644 --- a/src/uxBlock/select.go +++ b/src/uxBlock/select.go @@ -91,42 +91,41 @@ func (m *selectModel) Init() tea.Cmd { func (m *selectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Make sure these keys always quiting - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - - case "ctrl+c": - m.canceled = true - return m, tea.Quit - - case "up": - if m.cursor > 0 { - m.cursor-- - } - - case "down": - if m.cursor < len(m.tableBody.rows)-1 { - m.cursor++ - } - case "enter": - m.quiting = true + keyMsg, ok := msg.(tea.KeyMsg) + if !ok { + return m, nil + } + switch keyMsg.String() { + case "ctrl+c": + m.canceled = true + return m, tea.Quit + + case "up": + if m.cursor > 0 { + m.cursor-- + } - if !m.cfg.multiSelect { - m.selected = make(map[int]struct{}) - m.selected[m.cursor] = struct{}{} - } + case "down": + if m.cursor < len(m.tableBody.rows)-1 { + m.cursor++ + } + case "enter": + m.quiting = true - return m, tea.Quit + if !m.cfg.multiSelect { + m.selected = make(map[int]struct{}) + m.selected[m.cursor] = struct{}{} } - if m.cfg.multiSelect { - switch msg.String() { + return m, tea.Quit + } - case " ": - if _, ok := m.selected[m.cursor]; ok { - delete(m.selected, m.cursor) - } else { - m.selected[m.cursor] = struct{}{} - } + if m.cfg.multiSelect { + if keyMsg.String() == " " { + if _, ok := m.selected[m.cursor]; ok { + delete(m.selected, m.cursor) + } else { + m.selected[m.cursor] = struct{}{} } } } @@ -188,5 +187,7 @@ func (m *selectModel) View() string { s = SelectionIcon + m.cfg.label + "\n" } + t.Width(calculateTableWidth(t, m.uxBlocks.terminalWidth)) + return s + t.String() } diff --git a/src/uxBlock/showcase/main.go b/src/uxBlock/showcase/main.go index ffcdc233..71d58ae1 100644 --- a/src/uxBlock/showcase/main.go +++ b/src/uxBlock/showcase/main.go @@ -11,32 +11,23 @@ import ( "github.com/mattn/go-isatty" "github.com/zeropsio/zcli/src/logger" . "github.com/zeropsio/zcli/src/uxBlock" + "golang.org/x/term" ) func main() { ctx, cancel := context.WithCancel(context.Background()) regSignals(cancel) - blocks, err := createBlocks(cancel) - if err != nil { - fmt.Println(err) - os.Exit(1) - } + blocks := createBlocks(cancel) - err = do(ctx, blocks) - if err != nil { - fmt.Println(err) - os.Exit(1) - } + do(ctx, blocks) } -func do(ctx context.Context, blocks UxBlocks) error { +func do(ctx context.Context, blocks UxBlocks) { prompts(ctx, blocks) spinners(ctx, blocks) texts(ctx, blocks) tables(ctx, blocks) - - return nil } func spinners(ctx context.Context, blocks UxBlocks) { @@ -92,7 +83,7 @@ func prompts(ctx context.Context, blocks UxBlocks) { fmt.Println("========= prompt block end =========") } -func texts(ctx context.Context, blocks UxBlocks) { +func texts(_ context.Context, blocks UxBlocks) { fmt.Println("========= texts block =========") blocks.PrintInfoLine("info line") blocks.PrintWarningLine("warning line") @@ -106,7 +97,12 @@ func tables(ctx context.Context, blocks UxBlocks) { tableData := [][]string{ {"lorem", "ipsum", "dolor", "sit"}, - {"amet", "consectetur", "adipiscing", "elit"}, + { + "amet", + "lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", + "adipiscing", + "elit", + }, {"sed", "do", "eiusmod", "tempor"}, {"incididunt", "ut", "labore", "et"}, } @@ -145,18 +141,23 @@ func regSignals(contextCancel func()) { }() } -func createBlocks(contextCancelFunc func()) (UxBlocks, error) { +func createBlocks(contextCancelFunc func()) UxBlocks { isTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) outputLogger := logger.NewOutputLogger(logger.OutputConfig{ IsTerminal: isTerminal, }) + width, _, err := term.GetSize(0) + if err != nil { + width = 100 + } + debugFileLogger := logger.NewDebugFileLogger(logger.DebugFileConfig{ FilePath: "zerops.log", }) - blocks := NewBlock(outputLogger, debugFileLogger, isTerminal, contextCancelFunc) + blocks := NewBlock(outputLogger, debugFileLogger, isTerminal, width, contextCancelFunc) - return blocks, nil + return blocks } diff --git a/src/uxBlock/spinner.go b/src/uxBlock/spinner.go index 92e7e590..be4a9b84 100644 --- a/src/uxBlock/spinner.go +++ b/src/uxBlock/spinner.go @@ -30,6 +30,7 @@ func (b *uxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOpti p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) go func() { + //nolint:errcheck p.Run() if model.canceled { b.ctxCancel() @@ -77,9 +78,7 @@ func (m *spinnerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Quit case tea.KeyMsg: - switch msg.String() { - case "ctrl+c": - + if msg.String() == "ctrl+c" { m.canceled = true m.quiting = true return m, tea.Quit @@ -106,14 +105,11 @@ func (m *spinnerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { lock.Lock() cmdList[i] = cmd lock.Unlock() - }(i) } wg.Wait() return m, XXX(cmdList...) - } - return m, nil } diff --git a/src/uxBlock/table.go b/src/uxBlock/table.go index 636da285..7f2c8008 100644 --- a/src/uxBlock/table.go +++ b/src/uxBlock/table.go @@ -134,5 +134,19 @@ func (b *uxBlocks) Table(body *TableBody, auxOptions ...TableOption) { } t = t.Rows(rows...) + t.Width(calculateTableWidth(t, b.terminalWidth)) + fmt.Println(t) } + +// calculateTableWidth calculates the width of the table. +// If the table is wider than the terminal, a table starts falling apart. +// To set a fix width could help, but in that case, even if the table is smaller, it takes the whole terminal width. +// And it doesn't look good. +func calculateTableWidth(t *table.Table, terminalWidth int) int { + tableWidth := lipgloss.Width(t.String()) + if tableWidth > terminalWidth { + return terminalWidth + } + return 0 +} diff --git a/src/cmd/uxHelpers.go b/src/uxHelpers/prompt.go similarity index 56% rename from src/cmd/uxHelpers.go rename to src/uxHelpers/prompt.go index 9b5e9888..36354d22 100644 --- a/src/cmd/uxHelpers.go +++ b/src/uxHelpers/prompt.go @@ -1,17 +1,17 @@ -package cmd +package uxHelpers import ( "context" "github.com/pkg/errors" - "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock" ) -func YesNoPromptDestructive(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData, message string) error { +func YesNoPromptDestructive(ctx context.Context, uxBlocks uxBlock.UxBlocks, message string) error { // TODO - janhajek translate choices := []string{"NO", "YES"} - choice, err := cmdData.UxBlocks.Prompt(ctx, message, choices) + choice, err := uxBlocks.Prompt(ctx, message, choices) if err != nil { return err } diff --git a/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go b/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go index cc2b6201..96d51c64 100644 --- a/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go +++ b/src/zeropsRestApiClient/handler_get_service_stacks_by_project.go @@ -102,5 +102,4 @@ type EsServiceStackInfoJsonObject struct { ServiceStackTypeName types.String `json:"serviceStackTypeName"` // serviceStackTypeName - types.String ServiceStackTypeCategory enum.ServiceStackTypeCategoryEnum `json:"serviceStackTypeCategory"` // serviceStackTypeCategory - enum.ServiceStackTypeCategoryEnum ServiceStackTypeVersionName types.String `json:"serviceStackTypeVersionName"` // serviceStackTypeVersionName - types.String - } diff --git a/tools/gomodrun.go b/tools/gomodrun.go index 98600fbe..437601d2 100644 --- a/tools/gomodrun.go +++ b/tools/gomodrun.go @@ -1,12 +1,13 @@ package main import ( - "fmt" "log" "os" "os/exec" "path" "path/filepath" + + "github.com/pkg/errors" ) func getMod(dir string) (string, error) { @@ -17,7 +18,7 @@ func getMod(dir string) (string, error) { if newDir != "" { return getMod(newDir) } - return "", fmt.Errorf("go.mod not found") + return "", errors.New("go.mod not found") } func main() { diff --git a/tools/install.sh b/tools/install.sh index e2f46a73..e0887c47 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -17,32 +17,6 @@ export PATH="${GOBIN}:${PATH}" echo "GOBIN=${GOBIN}" -go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.1 -go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2.0 - -[[ -f protoc.zip ]] && rm protoc.zip -[[ -f bin/protoc ]] && rm bin/protoc -[[ -d include ]] && rm -rf include -[[ -d tmp ]] && rm -rf tmp -mkdir include -mkdir tmp -cd tmp - -if [[ "$OSTYPE" == "darwin"* ]]; then - wget -O protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v21.3/protoc-21.3-osx-x86_64.zip -else - wget -O protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v21.3/protoc-21.3-linux-x86_64.zip -fi - -ls -la protoc.zip -unzip protoc.zip - -mv bin/protoc ../bin -mv -v ./include/* ../include/google - -cd .. -chmod +x bin/protoc - rm -rf tmp # https://github.com/golangci/golangci-lint#go Please, do not installDaemon golangci-lint by go get From cd12a0ecf9aafc7ad673edfc76826369b6854efe Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Wed, 21 Feb 2024 17:22:56 +0100 Subject: [PATCH 08/12] new styles --- .golangci.yaml | 2 - Makefile | 6 +- go.sum | 4 + src/archiveClient/handler_findFilesByRules.go | 7 +- .../handler_findFilesByRules_test.go | 2 +- src/archiveClient/handler_tarFile.go | 1 + src/cmd/login.go | 3 +- src/cmd/projectImport.go | 9 +- src/cmd/projectServiceImport.go | 7 +- src/cmd/root.go | 16 +- src/cmd/scopeProject.go | 7 +- src/cmd/scopeReset.go | 3 +- src/cmd/serviceDeploy.go | 5 +- src/cmd/servicePush.go | 9 +- src/cmd/servicePushDeployShared.go | 3 +- src/cmd/statusInfo.go | 3 +- src/cmd/statusShowDebugLogs.go | 3 +- src/cmdBuilder/cmdBuilderCreateRunFunc.go | 40 ++-- src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 32 +++ src/cmdBuilder/dependencyTreeProject.go | 5 +- src/cmdBuilder/dependencyTreeService.go | 4 +- src/constants/darwin.go | 34 +--- src/constants/linux.go | 34 +--- src/constants/windows.go | 33 +--- src/constants/zerops.go | 72 +++++-- src/i18n/en.go | 15 +- src/i18n/i18n.go | 5 + src/logger/handler.go | 11 +- src/params/handler.go | 18 +- src/storage/handler.go | 4 +- src/uxBlock/blocks.go | 11 +- src/uxBlock/logs.go | 42 ++-- src/uxBlock/mocks/blocks.go | 172 ++++++---------- src/uxBlock/prompt.go | 32 +-- src/uxBlock/select.go | 59 +++--- src/uxBlock/showcase/main.go | 57 +++--- src/uxBlock/spinner.go | 21 +- src/uxBlock/styles.go | 108 ---------- src/uxBlock/styles/helpers.go | 47 +++++ src/uxBlock/styles/line.go | 50 +++++ src/uxBlock/styles/styles.go | 186 ++++++++++++++++++ src/uxBlock/table.go | 30 +-- src/uxHelpers/org.go | 3 +- src/uxHelpers/project.go | 3 +- src/uxHelpers/service.go | 3 +- src/uxHelpers/spinner.go | 7 +- src/yamlReader/readYaml.go | 5 +- 47 files changed, 672 insertions(+), 561 deletions(-) delete mode 100644 src/uxBlock/styles.go create mode 100644 src/uxBlock/styles/helpers.go create mode 100644 src/uxBlock/styles/line.go create mode 100644 src/uxBlock/styles/styles.go diff --git a/.golangci.yaml b/.golangci.yaml index 8e2a1795..cd6e5101 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -68,7 +68,6 @@ linters: - ifshort - importas - ineffassign - - interfacebloat - interfacer - loggercheck - maintidx @@ -80,7 +79,6 @@ linters: - nestif - nilerr - noctx - - nolintlint - nosprintfhostport - perfsprint - prealloc diff --git a/Makefile b/Makefile index e469439f..9c52e7e5 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,9 @@ help: @printf "possible values: test, lint" test: - go test -v ./cmd/... ./src/... + go test -v ./cmd/... ./src/... lint: - gomodrun golangci-lint run ./cmd/... ./src/... --verbose \ No newline at end of file + GOOS=darwin GOARCH=arm64 gomodrun golangci-lint run ./cmd/... ./src/... --verbose + GOOS=linux GOARCH=amd64 gomodrun golangci-lint run ./cmd/... ./src/... --verbose + GOOS=windows GOARCH=amd64 gomodrun golangci-lint run ./cmd/... ./src/... --verbose \ No newline at end of file diff --git a/go.sum b/go.sum index 9aa81e4e..6584cc30 100644 --- a/go.sum +++ b/go.sum @@ -116,6 +116,8 @@ golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= @@ -145,6 +147,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/src/archiveClient/handler_findFilesByRules.go b/src/archiveClient/handler_findFilesByRules.go index 1aa1a0ef..89d841a8 100644 --- a/src/archiveClient/handler_findFilesByRules.go +++ b/src/archiveClient/handler_findFilesByRules.go @@ -8,6 +8,7 @@ import ( "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) func (h *Handler) FindFilesByRules(uxBlocks uxBlock.UxBlocks, workingDir string, sources []string) ([]File, error) { @@ -16,7 +17,7 @@ func (h *Handler) FindFilesByRules(uxBlocks uxBlock.UxBlocks, workingDir string, return nil, err } - uxBlocks.PrintLine(i18n.T(i18n.ArchClientWorkingDirectory, workingDir)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ArchClientWorkingDirectory, workingDir))) // resulting function returns File from provided path // if file shouldn't be included in the result, File.ArchivePath will be empty @@ -56,9 +57,9 @@ func (h *Handler) FindFilesByRules(uxBlocks uxBlock.UxBlocks, workingDir string, if fileInfo.IsDir() { source = strings.TrimSuffix(source, string(os.PathSeparator)) + string(os.PathSeparator) - uxBlocks.PrintLine(i18n.T(i18n.ArchClientPackingDirectory, source)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ArchClientPackingDirectory, source))) } else { - uxBlocks.PrintLine(i18n.T(i18n.ArchClientPackingFile, source)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ArchClientPackingFile, source))) } trimPath, err := filepath.Abs(filepath.Join(workingDir, parts[0])) diff --git a/src/archiveClient/handler_findFilesByRules_test.go b/src/archiveClient/handler_findFilesByRules_test.go index c19e63c7..6de1eae7 100644 --- a/src/archiveClient/handler_findFilesByRules_test.go +++ b/src/archiveClient/handler_findFilesByRules_test.go @@ -223,7 +223,7 @@ var testErrorResponseDataProvider = []struct { func TestValidation(t *testing.T) { ctrl := gomock.NewController(t) uxBlocks := mocks.NewMockUxBlocks(ctrl) - uxBlocks.EXPECT().PrintLine(gomock.Any()).AnyTimes() + uxBlocks.EXPECT().PrintInfo(gomock.Any()).AnyTimes() for _, test := range testErrorResponseDataProvider { test := test // scope lint diff --git a/src/archiveClient/handler_tarFile.go b/src/archiveClient/handler_tarFile.go index 7bd9f187..8c9b6c7c 100644 --- a/src/archiveClient/handler_tarFile.go +++ b/src/archiveClient/handler_tarFile.go @@ -32,6 +32,7 @@ func tarFile(archive *tar.Writer, file File, info os.FileInfo) error { return err } + //nolint:exhaustive // Why: Other file types are not supported switch mode := info.Mode(); mode & os.ModeType { case os.ModeDir, os.ModeSymlink: return nil diff --git a/src/cmd/login.go b/src/cmd/login.go index 0fd65cc7..f6e3a70e 100644 --- a/src/cmd/login.go +++ b/src/cmd/login.go @@ -12,6 +12,7 @@ import ( "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/region" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" ) @@ -59,7 +60,7 @@ func loginCmd() *cmdBuilder.Cmd { return err } - uxBlocks.PrintSuccessLine(i18n.T(i18n.LoginSuccess, output.FullName, output.Email)) + uxBlocks.PrintInfo(styles.SuccessLine(i18n.T(i18n.LoginSuccess, output.FullName, output.Email))) return nil }) diff --git a/src/cmd/projectImport.go b/src/cmd/projectImport.go index 0428bf37..bbdb382a 100644 --- a/src/cmd/projectImport.go +++ b/src/cmd/projectImport.go @@ -6,6 +6,7 @@ import ( "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zcli/src/yamlReader" "github.com/zeropsio/zerops-go/dto/input/body" @@ -69,16 +70,16 @@ func projectImportCmd() *cmdBuilder.Cmd { } } - uxBlocks.PrintLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks))) - uxBlocks.PrintLine(i18n.T(i18n.QueuedProcesses, len(processes))) - uxBlocks.PrintLine(i18n.T(i18n.CoreServices)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks)))) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.QueuedProcesses, len(processes)))) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.CoreServices))) err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, processes) if err != nil { return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.ProjectImported)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ProjectImported))) return nil }) diff --git a/src/cmd/projectServiceImport.go b/src/cmd/projectServiceImport.go index 6e984ec7..73889886 100644 --- a/src/cmd/projectServiceImport.go +++ b/src/cmd/projectServiceImport.go @@ -5,6 +5,7 @@ import ( "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zcli/src/yamlReader" "github.com/zeropsio/zerops-go/dto/input/body" @@ -56,15 +57,15 @@ func projectServiceImportCmd() *cmdBuilder.Cmd { } } - uxBlocks.PrintLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks))) - uxBlocks.PrintLine(i18n.T(i18n.QueuedProcesses, len(processes))) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks)))) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.QueuedProcesses, len(processes)))) err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, processes) if err != nil { return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.ServiceImported)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ServiceImported))) return nil }) diff --git a/src/cmd/root.go b/src/cmd/root.go index 2e6c18cf..33cb2bdd 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -5,14 +5,14 @@ import ( ) func ExecuteCmd() error { - cmdBuilder := cmdBuilder.NewCmdBuilder() + builder := cmdBuilder.NewCmdBuilder() - cmdBuilder.AddCommand(loginCmd()) - cmdBuilder.AddCommand(versionCmd()) - cmdBuilder.AddCommand(scopeCmd()) - cmdBuilder.AddCommand(projectCmd()) - cmdBuilder.AddCommand(serviceCmd()) - cmdBuilder.AddCommand(statusCmd()) + builder.AddCommand(loginCmd()) + builder.AddCommand(versionCmd()) + builder.AddCommand(scopeCmd()) + builder.AddCommand(projectCmd()) + builder.AddCommand(serviceCmd()) + builder.AddCommand(statusCmd()) - return cmdBuilder.CreateAndExecuteRootCobraCmd() + return builder.CreateAndExecuteRootCobraCmd() } diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go index 0a7f8007..91890fc6 100644 --- a/src/cmd/scopeProject.go +++ b/src/cmd/scopeProject.go @@ -9,6 +9,7 @@ import ( "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -26,9 +27,9 @@ func scopeProjectCmd() *cmdBuilder.Cmd { if !errorsx.IsUserError(err) { return err } - cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) + cmdData.UxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ScopedProjectNotFound))) } else { - cmdData.UxBlocks.PrintInfoLine(i18n.T(i18n.PreviouslyScopedProject, project.Name.String())) + cmdData.UxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(i18n.PreviouslyScopedProject), project.Name.String())) } } @@ -57,7 +58,7 @@ func scopeProjectCmd() *cmdBuilder.Cmd { return err } - cmdData.UxBlocks.PrintInfoLine(i18n.T(infoText, project.Name.String())) + cmdData.UxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(infoText), project.Name.String())) return nil }) diff --git a/src/cmd/scopeReset.go b/src/cmd/scopeReset.go index bfb23dcc..2efdcddc 100644 --- a/src/cmd/scopeReset.go +++ b/src/cmd/scopeReset.go @@ -6,6 +6,7 @@ import ( "github.com/zeropsio/zcli/src/cliStorage" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -22,7 +23,7 @@ func scopeResetCmd() *cmdBuilder.Cmd { return err } - cmdData.UxBlocks.PrintInfoLine(i18n.T(i18n.ScopeReset)) + cmdData.UxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ScopeReset))) return nil }) diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go index 8cc8e3ca..1f08bbac 100644 --- a/src/cmd/serviceDeploy.go +++ b/src/cmd/serviceDeploy.go @@ -10,6 +10,7 @@ import ( "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/dto/input/body" "github.com/zeropsio/zerops-go/dto/input/path" @@ -50,7 +51,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart))) files, err := arch.FindFilesByRules( uxBlocks, @@ -127,7 +128,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployDeployingStart)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployDeployingStart))) deployResponse, err := cmdData.RestApiClient.PutAppVersionDeploy( ctx, diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go index 55670695..18579931 100644 --- a/src/cmd/servicePush.go +++ b/src/cmd/servicePush.go @@ -10,6 +10,7 @@ import ( "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/dto/input/body" "github.com/zeropsio/zerops-go/dto/input/path" @@ -36,7 +37,7 @@ func servicePushCmd() *cmdBuilder.Cmd { DeployGitFolder: cmdData.Params.GetBool("deployGitFolder"), }) - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployCreatingPackageStart))) configContent, err := getValidConfigContent( uxBlocks, @@ -123,13 +124,13 @@ func servicePushCmd() *cmdBuilder.Cmd { return err } - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployCreatingPackageDone)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployCreatingPackageDone))) if cmdData.Params.GetString("archiveFilePath") != "" { - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployPackageSavedInto, cmdData.Params.GetString("archiveFilePath"))) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployPackageSavedInto, cmdData.Params.GetString("archiveFilePath")))) } - uxBlocks.PrintInfoLine(i18n.T(i18n.BuildDeployDeployingStart)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployDeployingStart))) sourceName := cmdData.Params.GetString("source") if sourceName == "" { diff --git a/src/cmd/servicePushDeployShared.go b/src/cmd/servicePushDeployShared.go index 4cb37dcf..6acc2d11 100644 --- a/src/cmd/servicePushDeployShared.go +++ b/src/cmd/servicePushDeployShared.go @@ -12,6 +12,7 @@ import ( "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/dto/input/body" "github.com/zeropsio/zerops-go/dto/output" @@ -111,7 +112,7 @@ func getValidConfigContent(uxBlocks uxBlock.UxBlocks, workingDir string, zeropsY return nil, err } - uxBlocks.PrintLine(i18n.T(i18n.BuildDeployZeropsYamlFound, zeropsYamlPath)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.BuildDeployZeropsYamlFound, zeropsYamlPath))) if zeropsYamlStat.Size() == 0 { return nil, errors.New(i18n.T(i18n.BuildDeployZeropsYamlEmpty)) diff --git a/src/cmd/statusInfo.go b/src/cmd/statusInfo.go index 3d010fdc..d26d6e52 100644 --- a/src/cmd/statusInfo.go +++ b/src/cmd/statusInfo.go @@ -10,6 +10,7 @@ import ( "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) func statusInfoCmd() *cmdBuilder.Cmd { @@ -38,7 +39,7 @@ func statusInfoCmd() *cmdBuilder.Cmd { project, err := repository2.GetProjectById(ctx, cmdData.RestApiClient, projectId) if err != nil { if errorsx.IsUserError(err) { - cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) + cmdData.UxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ScopedProjectNotFound))) } return err diff --git a/src/cmd/statusShowDebugLogs.go b/src/cmd/statusShowDebugLogs.go index 5bfdb6e9..70725390 100644 --- a/src/cmd/statusShowDebugLogs.go +++ b/src/cmd/statusShowDebugLogs.go @@ -9,6 +9,7 @@ import ( "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) func statusShowDebugLogsCmd() *cmdBuilder.Cmd { @@ -33,7 +34,7 @@ func statusShowDebugLogsCmd() *cmdBuilder.Cmd { filesize := stat.Size() if filesize == 0 { - cmdData.UxBlocks.PrintLine(i18n.T(i18n.DebugLogsNotFound)) + cmdData.UxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.DebugLogsNotFound))) return nil } diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index ff70cc62..8d13b4cf 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -20,6 +20,7 @@ import ( "github.com/zeropsio/zcli/src/storage" "github.com/zeropsio/zcli/src/support" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/apiError" "golang.org/x/term" @@ -78,11 +79,6 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co regSignals(cancel) ctx = support.Context(ctx) - loggerFilePath, err := constants.LogFilePath() - if err != nil { - return errors.New(i18n.T(i18n.LoggerUnableToOpenLogFileWarning)) - } - isTerminal, err := isTerminal() if err != nil { return err @@ -93,11 +89,11 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co width = 100 } - outputLogger, debugFileLogger := createLoggers(isTerminal, loggerFilePath) + outputLogger, debugFileLogger := createLoggers(isTerminal) uxBlocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, width, cancel) - uxBlocks.PrintDebugLine(fmt.Sprintf("Command: %s", cobraCmd.CommandPath())) + uxBlocks.LogDebug(fmt.Sprintf("Command: %s", cobraCmd.CommandPath())) defer func() { if err != nil { @@ -106,10 +102,8 @@ func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*co } }() - err = params.InitViper() - if err != nil { - return err - } + // TODO - janhajek move somewhere else? + params.InitViper() cliStorage, err := createCliStorage() if err != nil { @@ -195,28 +189,28 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { } func printError(err error, uxBlocks uxBlock.UxBlocks) { - uxBlocks.PrintDebugLine(fmt.Sprintf("error: %+v", err)) + uxBlocks.LogDebug(fmt.Sprintf("error: %+v", err)) if userErr := errorsx.AsUserError(err); userErr != nil { - uxBlocks.PrintErrorLine(err.Error()) + uxBlocks.PrintError(styles.ErrorLine(err.Error())) return } var apiErr apiError.Error if errors.As(err, &apiErr) { - uxBlocks.PrintErrorLine(apiErr.GetMessage()) + uxBlocks.PrintError(styles.ErrorLine(apiErr.GetMessage())) if apiErr.GetMeta() != nil { meta, err := yaml.Marshal(apiErr.GetMeta()) if err != nil { - uxBlocks.PrintErrorLine(fmt.Sprintf("couldn't parse meta of error: %s", apiErr.GetMessage())) + uxBlocks.PrintError(styles.ErrorLine(fmt.Sprintf("couldn't parse meta of error: %s", apiErr.GetMessage()))) } - uxBlocks.PrintErrorLine(string(meta)) + uxBlocks.PrintError(styles.ErrorLine(string(meta))) } return } - uxBlocks.PrintErrorLine(err.Error()) + uxBlocks.PrintError(styles.ErrorLine(err.Error())) } func isTerminal() (bool, error) { @@ -228,18 +222,22 @@ func isTerminal() (bool, error) { case TerminalModeEnabled: return true, nil default: - // TODO - janhajek message - return false, errors.New("unknown terminal mode") + return false, errors.New(i18n.T(i18n.UnknownTerminalMode, TerminalFlag)) } } -func createLoggers(isTerminal bool, logFilePathFlag string) (*logger.Handler, *logger.Handler) { +func createLoggers(isTerminal bool) (*logger.Handler, *logger.Handler) { outputLogger := logger.NewOutputLogger(logger.OutputConfig{ IsTerminal: isTerminal, }) + loggerFilePath, err := constants.LogFilePath() + if err != nil { + outputLogger.Warning(styles.WarningLine(err.Error())) + } + debugFileLogger := logger.NewDebugFileLogger(logger.DebugFileConfig{ - FilePath: logFilePathFlag, + FilePath: loggerFilePath, }) return outputLogger, debugFileLogger diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go index c7e59bf6..b4cb3e34 100644 --- a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/params" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) type TerminalMode string @@ -63,5 +64,36 @@ func createRootCommand() *cobra.Command { rootCmd.PersistentFlags().StringVar(&TerminalFlag, "terminal", "auto", i18n.T(i18n.TerminalFlag)) + rootCmd.SetHelpTemplate(`` + styles.CobraSectionColor().SetString("Usage:").String() + `{{if .Runnable}} + {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} + {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} + +` + styles.CobraSectionColor().SetString("Aliases:").String() + ` + {{.NameAndAliases}}{{end}}{{if .HasExample}} + +` + styles.CobraSectionColor().SetString("Examples:").String() + ` +{{.Example}}{{end}}{{if .HasAvailableSubCommands}}{{$cmds := .Commands}}{{if eq (len .Groups) 0}} + +` + styles.CobraSectionColor().SetString("Available Commands:").String() + `{{range $cmds}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + ` + styles.CobraItemNameColor().SetString("{{rpad .Name .NamePadding }}").String() + ` {{.Short}}{{end}}{{end}}{{else}}{{range $group := .Groups}} + +{{.Title}}{{range $cmds}}{{if (and (eq .GroupID $group.ID) (or .IsAvailableCommand (eq .Name "help")))}} + ` + styles.CobraItemNameColor().SetString("{{rpad .Name .NamePadding }}").String() + ` {{.Short}}{{end}}{{end}}{{end}}{{if not .AllChildCommandsHaveGroup}} + +` + styles.CobraSectionColor().SetString("Additional Commands:").String() + `{{range $cmds}}{{if (and (eq .GroupID "") (or .IsAvailableCommand (eq .Name "help")))}} + ` + styles.CobraItemNameColor().SetString("{{rpad .Name .NamePadding }}").String() + ` {{.Short}}{{end}}{{end}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} + +` + styles.CobraSectionColor().SetString("Flags:").String() + ` +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} + +` + styles.CobraSectionColor().SetString("Global Flags:").String() + ` +{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} + +` + styles.CobraSectionColor().SetString("Additional help topics:").String() + `{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + ` + styles.CobraItemNameColor().SetString("{{rpad .CommandPath .CommandPathPadding}}").String() + ` {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} + +Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} +`) + return rootCmd } diff --git a/src/cmdBuilder/dependencyTreeProject.go b/src/cmdBuilder/dependencyTreeProject.go index 43f6eab2..4a682270 100644 --- a/src/cmdBuilder/dependencyTreeProject.go +++ b/src/cmdBuilder/dependencyTreeProject.go @@ -7,6 +7,7 @@ import ( "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -33,7 +34,7 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *Logg project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) if err != nil { if errorsx.IsUserError(err) { - cmdData.UxBlocks.PrintWarningLine(i18n.T(i18n.ScopedProjectNotFound)) + cmdData.UxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ScopedProjectNotFound))) } return err @@ -70,7 +71,7 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *Logg } cmdData.Project = project - cmdData.UxBlocks.PrintInfoLine(i18n.T(infoText, cmdData.Project.Name.String())) + cmdData.UxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(infoText), cmdData.Project.Name.String())) return nil } diff --git a/src/cmdBuilder/dependencyTreeService.go b/src/cmdBuilder/dependencyTreeService.go index 7d5083d0..d71dc6e2 100644 --- a/src/cmdBuilder/dependencyTreeService.go +++ b/src/cmdBuilder/dependencyTreeService.go @@ -6,6 +6,7 @@ import ( "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -54,7 +55,6 @@ func (s *service) LoadSelectedScope(ctx context.Context, _ *Cmd, cmdData *Logged } cmdData.Service = service - cmdData.UxBlocks.PrintInfoLine(i18n.T(infoText, cmdData.Service.Name.String())) - + cmdData.UxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(infoText), cmdData.Service.Name.String())) return nil } diff --git a/src/constants/darwin.go b/src/constants/darwin.go index 6c8032f5..76bfe572 100644 --- a/src/constants/darwin.go +++ b/src/constants/darwin.go @@ -6,37 +6,21 @@ package constants import ( "os" "path" - - "github.com/pkg/errors" ) -func getDataFilePaths() []pathReceiver { +func getDataFilePathsReceivers() []pathReceiver { return []pathReceiver{ - func() (string, error) { - env := os.Getenv(cliDataFilePathEnvVar) - if env != "" { - return env, nil - } - return "", errors.New("env is empty") - }, - receiverWithPath(os.UserConfigDir, zeropsDir, cliDataFileName), - receiverWithPath(os.UserHomeDir, zeropsDir, cliDataFileName), + receiverFromEnv(cliDataFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, zeropsDir, cliDataFileName), + receiverFromOsFunc(os.UserHomeDir, zeropsDir, cliDataFileName), } } -func getLogFilePath() []pathReceiver { +func getLogFilePathReceivers() []pathReceiver { return []pathReceiver{ - func() (string, error) { - env := os.Getenv(cliLogFilePathEnvVar) - if env != "" { - return env, nil - } - return "", errors.New("env is empty") - }, - func() (string, error) { - return path.Join("/usr/local/var/log/", zeropsLogFile), nil - }, - receiverWithPath(os.UserConfigDir, zeropsDir, zeropsLogFile), - receiverWithPath(os.UserHomeDir, zeropsDir, zeropsLogFile), + receiverFromEnv(cliLogFilePathEnvVar), + receiverFromPath(path.Join("/usr/local/var/log/", zeropsLogFile)), + receiverFromOsFunc(os.UserConfigDir, zeropsDir, zeropsLogFile), + receiverFromOsFunc(os.UserHomeDir, zeropsDir, zeropsLogFile), } } diff --git a/src/constants/linux.go b/src/constants/linux.go index 989649e9..7836fb3d 100644 --- a/src/constants/linux.go +++ b/src/constants/linux.go @@ -6,37 +6,21 @@ package constants import ( "os" "path" - - "github.com/pkg/errors" ) -func getDataFilePaths() []pathReceiver { +func getDataFilePathsReceivers() []pathReceiver { return []pathReceiver{ - func() (string, error) { - env := os.Getenv(cliDataFilePathEnvVar) - if env != "" { - return env, nil - } - return "", errors.New("env is empty") - }, - receiverWithPath(os.UserConfigDir, zeropsDir, cliDataFileName), - receiverWithPath(os.UserHomeDir, zeropsDir, cliDataFileName), + receiverFromEnv(cliDataFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, zeropsDir, cliDataFileName), + receiverFromOsFunc(os.UserHomeDir, zeropsDir, cliDataFileName), } } -func getLogFilePath() []pathReceiver { +func getLogFilePathReceivers() []pathReceiver { return []pathReceiver{ - func() (string, error) { - env := os.Getenv(cliLogFilePathEnvVar) - if env != "" { - return env, nil - } - return "", errors.New("env is empty") - }, - func() (string, error) { - return path.Join("/var/log/", zeropsDir, zeropsLogFile), nil - }, - receiverWithPath(os.UserConfigDir, zeropsDir, zeropsLogFile), - receiverWithPath(os.UserHomeDir, zeropsDir, zeropsLogFile), + receiverFromEnv(cliLogFilePathEnvVar), + receiverFromPath(path.Join("/var/log/", zeropsLogFile)), + receiverFromOsFunc(os.UserConfigDir, zeropsDir, zeropsLogFile), + receiverFromOsFunc(os.UserHomeDir, zeropsDir, zeropsLogFile), } } diff --git a/src/constants/windows.go b/src/constants/windows.go index ec8e705c..9c20367e 100644 --- a/src/constants/windows.go +++ b/src/constants/windows.go @@ -5,37 +5,24 @@ package constants import ( "os" - - "github.com/pkg/errors" ) -// this line is here to make linter happy +// this is here to make linter happy var _ = zeropsDir +var _ = receiverFromPath -func getDataFilePaths() []pathReceiver { +func getDataFilePathsReceivers() []pathReceiver { return []pathReceiver{ - func() (string, error) { - env := os.Getenv(cliDataFilePathEnvVar) - if env != "" { - return env, nil - } - return "", errors.New("env is empty") - }, - receiverWithPath(os.UserConfigDir, "Zerops", cliDataFileName), - receiverWithPath(os.UserHomeDir, "Zerops", cliDataFileName), + receiverFromEnv(cliDataFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, "Zerops", cliDataFileName), + receiverFromOsFunc(os.UserHomeDir, "Zerops", cliDataFileName), } } -func getLogFilePath() []pathReceiver { +func getLogFilePathReceivers() []pathReceiver { return []pathReceiver{ - func() (string, error) { - env := os.Getenv(cliLogFilePathEnvVar) - if env != "" { - return env, nil - } - return "", errors.New("env is empty") - }, - receiverWithPath(os.UserConfigDir, "Zerops", zeropsLogFile), - receiverWithPath(os.UserHomeDir, "Zerops", zeropsLogFile), + receiverFromEnv(cliLogFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, "Zerops", zeropsLogFile), + receiverFromOsFunc(os.UserHomeDir, "Zerops", zeropsLogFile), } } diff --git a/src/constants/zerops.go b/src/constants/zerops.go index cebbf10e..f644c590 100644 --- a/src/constants/zerops.go +++ b/src/constants/zerops.go @@ -4,8 +4,10 @@ import ( "os" "path" "path/filepath" + "strings" "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/i18n" ) const ( @@ -17,19 +19,55 @@ const ( cliLogFilePathEnvVar = "ZEROPS_CLI_LOG_FILE_PATH" ) -type pathReceiver func() (string, error) +type pathReceiver func() (path string, err error) func CliDataFilePath() (string, error) { - return findFirstWritablePath(getDataFilePaths()) + pathReceivers := getDataFilePathsReceivers() + path := findFirstWritablePath(pathReceivers) + if path == "" { + paths := make([]string, 0, len(pathReceivers)) + for _, p := range pathReceivers { + _, err := p() + paths = append(paths, err.Error()) + } + return "", errors.New(i18n.T(i18n.UnableToWriteCliData, "\n"+strings.Join(paths, "\n"))) + } + return path, nil } func LogFilePath() (string, error) { - return findFirstWritablePath(getLogFilePath()) + pathReceivers := getLogFilePathReceivers() + path := findFirstWritablePath(pathReceivers) + if path == "" { + paths := make([]string, 0, len(pathReceivers)) + for _, p := range pathReceivers { + _, err := p() + paths = append(paths, err.Error()) + } + return "", errors.New(i18n.T(i18n.UnableToWriteLogFile, "\n"+strings.Join(paths, "\n"))) + } + return path, nil +} + +func receiverFromPath(path string) pathReceiver { + return func() (string, error) { + return checkPath(path) + } } -func receiverWithPath(receiver pathReceiver, elem ...string) pathReceiver { +func receiverFromEnv(envName string) pathReceiver { return func() (string, error) { - dir, err := receiver() + env := os.Getenv(envName) + if env == "" { + return "", errors.Errorf("env %s is empty", envName) + } + return checkPath(env) + } +} + +func receiverFromOsFunc(osFunc func() (string, error), elem ...string) pathReceiver { + return func() (string, error) { + dir, err := osFunc() if err != nil { return "", err } @@ -39,32 +77,32 @@ func receiverWithPath(receiver pathReceiver, elem ...string) pathReceiver { } } -func findFirstWritablePath(paths []pathReceiver) (string, error) { - checkedPaths := make([]string, 0, len(paths)) +func findFirstWritablePath(paths []pathReceiver) string { for _, p := range paths { path, err := p() if err == nil { - checkedPaths = append(checkedPaths, path) - if err := checkPath(path); err == nil { - return path, nil - } + return path } } - // TODO - janhajek translate - return "", errors.Errorf("Unable to find writable path from %v", checkedPaths) + return "" } -func checkPath(filePath string) error { +func checkPath(filePath string) (string, error) { dir := path.Dir(filePath) if err := os.MkdirAll(dir, 0775); err != nil { - return err + return "", err } f, err := os.OpenFile(filePath, os.O_RDONLY|os.O_CREATE, 0666) if err != nil { - return err + return "", err + } + err = f.Close() + if err != nil { + return "", err } - return f.Close() + + return filePath, nil } diff --git a/src/i18n/en.go b/src/i18n/en.go index 9ca8d603..4265068c 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -219,6 +219,11 @@ var en = map[string]string{ // global // //////////// + UnknownTerminalMode: "Unknown terminal mode: %s", + UnableToDecodeJsonFile: "Unable to decode json file: %s", + UnableToWriteCliData: "Unable to write zcli data, paths tested: %s", + UnableToWriteLogFile: "Unable to write zcli debug log file, paths tested: %s", + // args ArgsOnlyOneOptionalAllowed: "optional arg %s can be only the last one", ArgsOnlyOneArrayAllowed: "array arg %s can be only the last one", @@ -226,7 +231,7 @@ var en = map[string]string{ ArgsTooManyArgs: "expected no more than %d arg(s), got %d", // logger - LoggerUnableToOpenLogFileWarning: "Failed to open a log file, used path: %s. Try to use --log-file-path flag.\n", + LoggerUnableToOpenLogFileWarning: "Failed to open a log file, used path: %s", // ux helpers ProjectSelectorListEmpty: "You don't have any projects yet. Create a new project using `zcli project import` command.", @@ -246,11 +251,11 @@ zcli login {token} more info: https://docs.zerops.io/documentation/cli/authorization.html`, // scope - SelectedProject: "Selected project: %s", - SelectedService: "Selected service: %s", - ScopedProject: "Scoped project: %s", + SelectedProject: "Selected project", + SelectedService: "Selected service", + ScopedProject: "Scoped project", ScopedProjectNotFound: "Scoped project wasn't found, Select a different project using `zcli scope project` command.", - PreviouslyScopedProject: "Previously scoped project: %s", + PreviouslyScopedProject: "Previously scoped project", ScopeReset: "Scope was reset", DestructiveOperationConfirmationFailed: "You have to confirm a destructive operation.", diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index 3d8f509a..9415cf17 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -257,6 +257,11 @@ const ( // global // //////////// + UnknownTerminalMode = "UnknownTerminalMode" + UnableToDecodeJsonFile = "UnableToDecodeJsonFile" + UnableToWriteCliData = "UnableToWriteCliData" + UnableToWriteLogFile = "UnableToWriteLogFile" + // args ArgsOnlyOneOptionalAllowed = "ArgsOnlyOneOptionalAllowed" ArgsOnlyOneArrayAllowed = "ArgsOnlyOneArrayAllowed" diff --git a/src/logger/handler.go b/src/logger/handler.go index 2ea572f1..eea85fb8 100644 --- a/src/logger/handler.go +++ b/src/logger/handler.go @@ -1,11 +1,7 @@ package logger import ( - "fmt" "io" - "os" - - "github.com/zeropsio/zcli/src/i18n" "github.com/sirupsen/logrus" ) @@ -47,12 +43,7 @@ func NewDebugFileLogger(config DebugFileConfig) *Handler { l.Out = io.Discard l.Level = logrus.DebugLevel - file, err := os.OpenFile(config.FilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0775) - if err != nil { - os.Stdout.WriteString(fmt.Sprintf(i18n.T(i18n.LoggerUnableToOpenLogFileWarning), config.FilePath)) - } else { - file.Close() - + if config.FilePath != "" { l.AddHook(&VarLogHook{ path: config.FilePath, levels: []logrus.Level{logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel}, diff --git a/src/params/handler.go b/src/params/handler.go index 2679654e..e3f25576 100644 --- a/src/params/handler.go +++ b/src/params/handler.go @@ -4,10 +4,9 @@ import ( "fmt" "os" - "github.com/zeropsio/zcli/src/constants" - "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/zeropsio/zcli/src/constants" ) type Handler struct { @@ -107,17 +106,16 @@ func (h *Handler) GetBool(cmd *cobra.Command, name string) bool { return false } -func (h *Handler) InitViper() error { +func (h *Handler) InitViper() { path, err := os.Getwd() - if err != nil { - return err + if err == nil { + h.viper.AddConfigPath(path) } cliDataPath, err := constants.CliDataFilePath() - if err != nil { - return err + if err == nil { + h.viper.AddConfigPath(cliDataPath) } - h.viper.AddConfigPath(path) - h.viper.AddConfigPath(cliDataPath) + h.viper.SetConfigName("zcli.config") h.viper.SetEnvPrefix("ZEROPS") h.viper.AutomaticEnv() @@ -125,8 +123,6 @@ func (h *Handler) InitViper() error { if err := h.viper.ReadInConfig(); err == nil { fmt.Println("Using config file:", h.viper.ConfigFileUsed()) } - - return nil } func toSnakeCase(flagName string) string { diff --git a/src/storage/handler.go b/src/storage/handler.go index 7583c26a..bc127f8a 100644 --- a/src/storage/handler.go +++ b/src/storage/handler.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/i18n" ) type Config struct { @@ -54,8 +55,7 @@ func (h *Handler[T]) load() error { } if err := json.NewDecoder(f).Decode(&h.data); err != nil { - // TODO - janhajek translation - return errors.WithMessagef(err, "Unable to decode json file %s", h.config.FilePath) + return errors.WithMessagef(err, i18n.T(i18n.UnableToDecodeJsonFile, h.config.FilePath)) } return nil diff --git a/src/uxBlock/blocks.go b/src/uxBlock/blocks.go index e2b4663d..e271e989 100644 --- a/src/uxBlock/blocks.go +++ b/src/uxBlock/blocks.go @@ -5,17 +5,16 @@ import ( "context" "github.com/zeropsio/zcli/src/logger" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) //go:generate go run --mod=mod github.com/golang/mock/mockgen -source=$GOFILE -destination=$PWD/mocks/$GOFILE -package=mocks type UxBlocks interface { - PrintLine(values ...interface{}) - PrintSuccessLine(values ...string) - PrintInfoLine(values ...string) - PrintWarningLine(values ...string) - PrintErrorLine(values ...string) - PrintDebugLine(args ...interface{}) + LogDebug(message string) + PrintInfo(line styles.Line) + PrintWarning(line styles.Line) + PrintError(line styles.Line) Table(body *TableBody, auxOptions ...TableOption) Select(ctx context.Context, tableBody *TableBody, auxOptions ...SelectOption) ([]int, error) Prompt( diff --git a/src/uxBlock/logs.go b/src/uxBlock/logs.go index 3663192b..315f6503 100644 --- a/src/uxBlock/logs.go +++ b/src/uxBlock/logs.go @@ -1,40 +1,22 @@ package uxBlock -func (b *uxBlocks) PrintLine(values ...interface{}) { - b.info(values...) -} - -func (b *uxBlocks) PrintSuccessLine(values ...string) { - b.info(SuccessIcon, successColor.SetString(values...)) -} - -func (b *uxBlocks) PrintInfoLine(values ...string) { - b.info(InfoIcon, infoColor.SetString(values...)) -} - -func (b *uxBlocks) PrintWarningLine(values ...string) { - b.warning(WarningIcon, warningColor.SetString(values...)) -} - -func (b *uxBlocks) PrintErrorLine(values ...string) { - b.error(ErrorIcon, errorColor.SetString(values...)) -} +import "github.com/zeropsio/zcli/src/uxBlock/styles" -func (b *uxBlocks) PrintDebugLine(args ...interface{}) { - b.debugFileLogger.Debug(NewLine(args...).DisableStyle()) +func (b *uxBlocks) LogDebug(message string) { + b.debugFileLogger.Debug(message) } -func (b *uxBlocks) info(args ...interface{}) { - b.outputLogger.Info(NewLine(args...)) - b.debugFileLogger.Info(NewLine(args...).DisableStyle()) +func (b *uxBlocks) PrintInfo(line styles.Line) { + b.outputLogger.Info(line) + b.debugFileLogger.Info(line.DisableStyle()) } -func (b *uxBlocks) warning(args ...interface{}) { - b.outputLogger.Warning(NewLine(args...)) - b.debugFileLogger.Warning(NewLine(args...).DisableStyle()) +func (b *uxBlocks) PrintWarning(line styles.Line) { + b.outputLogger.Warning(line) + b.debugFileLogger.Warning(line.DisableStyle()) } -func (b *uxBlocks) error(args ...interface{}) { - b.outputLogger.Error(NewLine(args...)) - b.debugFileLogger.Error(NewLine(args...).DisableStyle()) +func (b *uxBlocks) PrintError(line styles.Line) { + b.outputLogger.Error(line) + b.debugFileLogger.Error(line.DisableStyle()) } diff --git a/src/uxBlock/mocks/blocks.go b/src/uxBlock/mocks/blocks.go index a35e232a..045ec2d0 100644 --- a/src/uxBlock/mocks/blocks.go +++ b/src/uxBlock/mocks/blocks.go @@ -6,148 +6,124 @@ package mocks import ( context "context" + reflect "reflect" + gomock "github.com/golang/mock/gomock" uxBlock "github.com/zeropsio/zcli/src/uxBlock" - reflect "reflect" + styles "github.com/zeropsio/zcli/src/uxBlock/styles" ) -// MockUxBlocks is a mock of UxBlocks interface +// MockUxBlocks is a mock of UxBlocks interface. type MockUxBlocks struct { ctrl *gomock.Controller recorder *MockUxBlocksMockRecorder } -// MockUxBlocksMockRecorder is the mock recorder for MockUxBlocks +// MockUxBlocksMockRecorder is the mock recorder for MockUxBlocks. type MockUxBlocksMockRecorder struct { mock *MockUxBlocks } -// NewMockUxBlocks creates a new mock instance +// NewMockUxBlocks creates a new mock instance. func NewMockUxBlocks(ctrl *gomock.Controller) *MockUxBlocks { mock := &MockUxBlocks{ctrl: ctrl} mock.recorder = &MockUxBlocksMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockUxBlocks) EXPECT() *MockUxBlocksMockRecorder { return m.recorder } -// PrintLine mocks base method -func (m *MockUxBlocks) PrintLine(values ...interface{}) { +// LogDebug mocks base method. +func (m *MockUxBlocks) LogDebug(message string) { m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range values { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "PrintLine", varargs...) + m.ctrl.Call(m, "LogDebug", message) } -// PrintLine indicates an expected call of PrintLine -func (mr *MockUxBlocksMockRecorder) PrintLine(values ...interface{}) *gomock.Call { +// LogDebug indicates an expected call of LogDebug. +func (mr *MockUxBlocksMockRecorder) LogDebug(message interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintLine), values...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogDebug", reflect.TypeOf((*MockUxBlocks)(nil).LogDebug), message) } -// PrintSuccessLine mocks base method -func (m *MockUxBlocks) PrintSuccessLine(values ...string) { +// PrintError mocks base method. +func (m *MockUxBlocks) PrintError(line styles.Line) { m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range values { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "PrintSuccessLine", varargs...) + m.ctrl.Call(m, "PrintError", line) } -// PrintSuccessLine indicates an expected call of PrintSuccessLine -func (mr *MockUxBlocksMockRecorder) PrintSuccessLine(values ...interface{}) *gomock.Call { +// PrintError indicates an expected call of PrintError. +func (mr *MockUxBlocksMockRecorder) PrintError(line interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintSuccessLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintSuccessLine), values...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintError", reflect.TypeOf((*MockUxBlocks)(nil).PrintError), line) } -// PrintInfoLine mocks base method -func (m *MockUxBlocks) PrintInfoLine(values ...string) { +// PrintInfo mocks base method. +func (m *MockUxBlocks) PrintInfo(line styles.Line) { m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range values { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "PrintInfoLine", varargs...) + m.ctrl.Call(m, "PrintInfo", line) } -// PrintInfoLine indicates an expected call of PrintInfoLine -func (mr *MockUxBlocksMockRecorder) PrintInfoLine(values ...interface{}) *gomock.Call { +// PrintInfo indicates an expected call of PrintInfo. +func (mr *MockUxBlocksMockRecorder) PrintInfo(line interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintInfoLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintInfoLine), values...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintInfo", reflect.TypeOf((*MockUxBlocks)(nil).PrintInfo), line) } -// PrintWarningLine mocks base method -func (m *MockUxBlocks) PrintWarningLine(values ...string) { +// PrintWarning mocks base method. +func (m *MockUxBlocks) PrintWarning(line styles.Line) { m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range values { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "PrintWarningLine", varargs...) -} - -// PrintWarningLine indicates an expected call of PrintWarningLine -func (mr *MockUxBlocksMockRecorder) PrintWarningLine(values ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintWarningLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintWarningLine), values...) -} - -// PrintErrorLine mocks base method -func (m *MockUxBlocks) PrintErrorLine(values ...string) { - m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range values { - varargs = append(varargs, a) - } - m.ctrl.Call(m, "PrintErrorLine", varargs...) + m.ctrl.Call(m, "PrintWarning", line) } -// PrintErrorLine indicates an expected call of PrintErrorLine -func (mr *MockUxBlocksMockRecorder) PrintErrorLine(values ...interface{}) *gomock.Call { +// PrintWarning indicates an expected call of PrintWarning. +func (mr *MockUxBlocksMockRecorder) PrintWarning(line interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintErrorLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintErrorLine), values...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintWarning", reflect.TypeOf((*MockUxBlocks)(nil).PrintWarning), line) } -// PrintDebugLine mocks base method -func (m *MockUxBlocks) PrintDebugLine(args ...interface{}) { +// Prompt mocks base method. +func (m *MockUxBlocks) Prompt(ctx context.Context, message string, choices []string, auxOptions ...uxBlock.PromptOption) (int, error) { m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range args { + varargs := []interface{}{ctx, message, choices} + for _, a := range auxOptions { varargs = append(varargs, a) } - m.ctrl.Call(m, "PrintDebugLine", varargs...) + ret := m.ctrl.Call(m, "Prompt", varargs...) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// PrintDebugLine indicates an expected call of PrintDebugLine -func (mr *MockUxBlocksMockRecorder) PrintDebugLine(args ...interface{}) *gomock.Call { +// Prompt indicates an expected call of Prompt. +func (mr *MockUxBlocksMockRecorder) Prompt(ctx, message, choices interface{}, auxOptions ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrintDebugLine", reflect.TypeOf((*MockUxBlocks)(nil).PrintDebugLine), args...) + varargs := append([]interface{}{ctx, message, choices}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Prompt", reflect.TypeOf((*MockUxBlocks)(nil).Prompt), varargs...) } -// Table mocks base method -func (m *MockUxBlocks) Table(body *uxBlock.TableBody, auxOptions ...uxBlock.TableOption) { +// RunSpinners mocks base method. +func (m *MockUxBlocks) RunSpinners(ctx context.Context, spinners []*uxBlock.Spinner, auxOptions ...uxBlock.SpinnerOption) func() { m.ctrl.T.Helper() - varargs := []interface{}{body} + varargs := []interface{}{ctx, spinners} for _, a := range auxOptions { varargs = append(varargs, a) } - m.ctrl.Call(m, "Table", varargs...) + ret := m.ctrl.Call(m, "RunSpinners", varargs...) + ret0, _ := ret[0].(func()) + return ret0 } -// Table indicates an expected call of Table -func (mr *MockUxBlocksMockRecorder) Table(body interface{}, auxOptions ...interface{}) *gomock.Call { +// RunSpinners indicates an expected call of RunSpinners. +func (mr *MockUxBlocksMockRecorder) RunSpinners(ctx, spinners interface{}, auxOptions ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{body}, auxOptions...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Table", reflect.TypeOf((*MockUxBlocks)(nil).Table), varargs...) + varargs := append([]interface{}{ctx, spinners}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunSpinners", reflect.TypeOf((*MockUxBlocks)(nil).RunSpinners), varargs...) } -// Select mocks base method +// Select mocks base method. func (m *MockUxBlocks) Select(ctx context.Context, tableBody *uxBlock.TableBody, auxOptions ...uxBlock.SelectOption) ([]int, error) { m.ctrl.T.Helper() varargs := []interface{}{ctx, tableBody} @@ -160,48 +136,26 @@ func (m *MockUxBlocks) Select(ctx context.Context, tableBody *uxBlock.TableBody, return ret0, ret1 } -// Select indicates an expected call of Select +// Select indicates an expected call of Select. func (mr *MockUxBlocksMockRecorder) Select(ctx, tableBody interface{}, auxOptions ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{ctx, tableBody}, auxOptions...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Select", reflect.TypeOf((*MockUxBlocks)(nil).Select), varargs...) } -// Prompt mocks base method -func (m *MockUxBlocks) Prompt(ctx context.Context, message string, choices []string, auxOptions ...uxBlock.PromptOption) (int, error) { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, message, choices} - for _, a := range auxOptions { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Prompt", varargs...) - ret0, _ := ret[0].(int) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Prompt indicates an expected call of Prompt -func (mr *MockUxBlocksMockRecorder) Prompt(ctx, message, choices interface{}, auxOptions ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, message, choices}, auxOptions...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Prompt", reflect.TypeOf((*MockUxBlocks)(nil).Prompt), varargs...) -} - -// RunSpinners mocks base method -func (m *MockUxBlocks) RunSpinners(ctx context.Context, spinners []*uxBlock.Spinner, auxOptions ...uxBlock.SpinnerOption) func() { +// Table mocks base method. +func (m *MockUxBlocks) Table(body *uxBlock.TableBody, auxOptions ...uxBlock.TableOption) { m.ctrl.T.Helper() - varargs := []interface{}{ctx, spinners} + varargs := []interface{}{body} for _, a := range auxOptions { varargs = append(varargs, a) } - ret := m.ctrl.Call(m, "RunSpinners", varargs...) - ret0, _ := ret[0].(func()) - return ret0 + m.ctrl.Call(m, "Table", varargs...) } -// RunSpinners indicates an expected call of RunSpinners -func (mr *MockUxBlocksMockRecorder) RunSpinners(ctx, spinners interface{}, auxOptions ...interface{}) *gomock.Call { +// Table indicates an expected call of Table. +func (mr *MockUxBlocksMockRecorder) Table(body interface{}, auxOptions ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, spinners}, auxOptions...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunSpinners", reflect.TypeOf((*MockUxBlocks)(nil).RunSpinners), varargs...) + varargs := append([]interface{}{body}, auxOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Table", reflect.TypeOf((*MockUxBlocks)(nil).Table), varargs...) } diff --git a/src/uxBlock/prompt.go b/src/uxBlock/prompt.go index 1f413468..7a95fa8f 100644 --- a/src/uxBlock/prompt.go +++ b/src/uxBlock/prompt.go @@ -7,6 +7,7 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) type promptConfig struct { @@ -26,7 +27,7 @@ func (b *uxBlocks) Prompt( } if !b.isTerminal { - b.PrintLine(message) + b.PrintInfo(styles.InfoLine(message)) return 0, errors.New(i18n.T(i18n.PromptAllowedOnlyInTerminal)) } @@ -98,9 +99,9 @@ func (m *promptModel) View() string { buttonsTexts := []string{} for i, choice := range m.choices { if i == m.cursor { - buttonsTexts = append(buttonsTexts, activeButtonStyle.Render(choice)) + buttonsTexts = append(buttonsTexts, styles.ActiveDialogButton().Render(choice)) } else { - buttonsTexts = append(buttonsTexts, buttonStyle.Render(choice)) + buttonsTexts = append(buttonsTexts, styles.DialogButton().Render(choice)) } } @@ -110,31 +111,8 @@ func (m *promptModel) View() string { dialog := lipgloss.Place(0, 0, lipgloss.Left, lipgloss.Center, - dialogBoxStyle.Render(ui), + styles.DialogBox().Render(ui), ) return dialog } - -var ( - dialogBoxStyle = lipgloss.NewStyle(). - Border(lipgloss.RoundedBorder()). - BorderForeground(lipgloss.Color("#874BFD")). - Padding(1, 0). - BorderTop(true). - BorderLeft(true). - BorderRight(true). - BorderBottom(true) - - buttonStyle = lipgloss.NewStyle(). - Foreground(lipgloss.Color("#FFF7DB")). - Background(lipgloss.Color("#888B7E")). - Padding(0, 3). - MarginRight(2). - MarginTop(1) - - activeButtonStyle = buttonStyle.Copy(). - Foreground(lipgloss.Color("#FFF7DB")). - Background(lipgloss.Color("#F25D94")). - Underline(true) -) diff --git a/src/uxBlock/select.go b/src/uxBlock/select.go index d3f6d350..3495944e 100644 --- a/src/uxBlock/select.go +++ b/src/uxBlock/select.go @@ -10,6 +10,7 @@ import ( "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss/table" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) type selectConfig struct { @@ -45,7 +46,7 @@ func (b *uxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions } if !b.isTerminal { - b.PrintLine(cfg.label) + b.PrintInfo(styles.InfoLine(cfg.label)) return nil, errors.New(i18n.T(i18n.SelectorAllowedOnlyInTerminal)) } @@ -56,8 +57,8 @@ func (b *uxBlocks) Select(ctx context.Context, tableBody *TableBody, auxOptions selected: make(map[int]struct{}), } p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) - _, err := p.Run() - if err != nil { + + if _, err := p.Run(); err != nil { return nil, err } @@ -138,53 +139,47 @@ func (m *selectModel) View() string { return "" } - baseStyle := lipgloss.NewStyle().Padding(0, 1) - t := table.New(). + BorderStyle(styles.InfoColor()). Border(lipgloss.NormalBorder()). - BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("238"))). StyleFunc(func(row, col int) lipgloss.Style { - even := row%2 == 0 - - if even { - return baseStyle.Copy().Foreground(lipgloss.Color("245")) + // in case that header is present, we need to adjust row index + if m.cfg.header != nil { + row -= 1 } - return baseStyle.Copy().Foreground(lipgloss.Color("252")) + if row == m.cursor { + return styles.TableRowActive() + } + + return styles.TableRow() }) if m.cfg.header != nil { - capitalizeHeaders := func(data []string) []string { - for i := range data { - data[i] = strings.ToUpper(data[i]) - } - return data - } - - headers := make([]string, len(m.cfg.header.cells)+1) - headers[0] = "" - for i, header := range m.cfg.header.cells { - headers[i+1] = header.Text + headers := make([]string, 0, len(m.cfg.header.cells)+1) + headers = append(headers, "") + for _, header := range m.cfg.header.cells { + headers = append(headers, strings.ToUpper(header.Text)) } - t = t.Headers(capitalizeHeaders(headers)...) + t = t.Headers(headers...) } - rows := make([][]string, len(m.tableBody.rows)) for rowIndex, row := range m.tableBody.rows { - cells := make([]string, len(row.cells)+1) - cells[0] = " " + cells := make([]string, 0, len(row.cells)+1) + icon := " " if rowIndex == m.cursor { - cells[0] = "✓" + icon = styles.SelectIcon } - for i, cell := range row.cells { - cells[i+1] = cell.Text + cells = append(cells, icon) + + for _, cell := range row.cells { + cells = append(cells, cell.Text) } - rows[rowIndex] = cells + t = t.Row(cells...) } - t = t.Rows(rows...) s := "" if m.cfg.label != "" { - s = SelectionIcon + m.cfg.label + "\n" + s = styles.SelectLine(m.cfg.label).String() + "\n" } t.Width(calculateTableWidth(t, m.uxBlocks.terminalWidth)) diff --git a/src/uxBlock/showcase/main.go b/src/uxBlock/showcase/main.go index 71d58ae1..f27df34d 100644 --- a/src/uxBlock/showcase/main.go +++ b/src/uxBlock/showcase/main.go @@ -10,7 +10,8 @@ import ( "github.com/mattn/go-isatty" "github.com/zeropsio/zcli/src/logger" - . "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock" + . "github.com/zeropsio/zcli/src/uxBlock/styles" "golang.org/x/term" ) @@ -23,22 +24,22 @@ func main() { do(ctx, blocks) } -func do(ctx context.Context, blocks UxBlocks) { +func do(ctx context.Context, blocks uxBlock.UxBlocks) { prompts(ctx, blocks) spinners(ctx, blocks) texts(ctx, blocks) tables(ctx, blocks) } -func spinners(ctx context.Context, blocks UxBlocks) { +func spinners(ctx context.Context, blocks uxBlock.UxBlocks) { { fmt.Println("========= spinners block =========") - spinner1 := NewSpinner(InfoText("Running 1").String()) - spinner2 := NewSpinner(InfoText("Running 2").String()) - spinner3 := NewSpinner(InfoText("Running 3").String()) + spinner1 := uxBlock.NewSpinner(NewLine("Running 1")) + spinner2 := uxBlock.NewSpinner(NewLine("Running 2")) + spinner3 := uxBlock.NewSpinner(NewLine("Running 3")) - stop := blocks.RunSpinners(ctx, []*Spinner{spinner1, spinner2, spinner3}) + stop := blocks.RunSpinners(ctx, []*uxBlock.Spinner{spinner1, spinner2, spinner3}) counter := 0 tick := time.NewTicker(time.Second * 1) @@ -50,13 +51,13 @@ func spinners(ctx context.Context, blocks UxBlocks) { case <-tick.C: counter++ if counter == 2 { - spinner2.Finish(NewLine(SuccessIcon, SuccessText("Finished successfully")).String()) + spinner2.Finish(SuccessLine("Finished successfully")) } if counter == 4 { - spinner1.Finish(NewLine(ErrorIcon, ErrorText("finished with error")).String()) + spinner1.Finish(ErrorLine("finished with error")) } if counter == 6 { - spinner3.Finish(NewLine(WarningIcon, WarningText("Finish with warning")).String()) + spinner3.Finish(WarningLine("Finish with warning")) } } if counter == 6 { @@ -70,7 +71,7 @@ func spinners(ctx context.Context, blocks UxBlocks) { } } -func prompts(ctx context.Context, blocks UxBlocks) { +func prompts(ctx context.Context, blocks uxBlock.UxBlocks) { fmt.Println("========= prompt block =========") choices := []string{"yes", "no", "maybe"} choice, err := blocks.Prompt(ctx, "Question?", choices) @@ -78,21 +79,25 @@ func prompts(ctx context.Context, blocks UxBlocks) { return } - blocks.PrintInfoLine("selected", choices[choice]) + blocks.PrintInfo(InfoWithValueLine("selected", choices[choice])) fmt.Println("========= prompt block end =========") } -func texts(_ context.Context, blocks UxBlocks) { +func texts(_ context.Context, blocks uxBlock.UxBlocks) { fmt.Println("========= texts block =========") - blocks.PrintInfoLine("info line") - blocks.PrintWarningLine("warning line") - blocks.PrintErrorLine("Error line") - blocks.PrintLine(WarningText("Line"), " with ", InfoIcon, InfoText("mixed"), " ", ErrorText("styles")) + blocks.PrintInfo(NewLine("line without style")) + blocks.PrintInfo(InfoLine("info line")) + blocks.PrintInfo(InfoWithValueLine("info line", "value")) + blocks.PrintInfo(SuccessLine("success line")) + blocks.PrintWarning(WarningLine("warning line")) + blocks.PrintError(ErrorLine("Error line")) + blocks.PrintInfo(SelectLine("Select line")) + blocks.PrintInfo(NewLine(WarningText("NewLine"), " with ", InfoIcon, InfoText("mixed"), " ", ErrorText("styles"))) fmt.Println("========= texts block end =========") } -func tables(ctx context.Context, blocks UxBlocks) { +func tables(ctx context.Context, blocks uxBlock.UxBlocks) { fmt.Println("========= table selection block =========") tableData := [][]string{ @@ -107,25 +112,25 @@ func tables(ctx context.Context, blocks UxBlocks) { {"incididunt", "ut", "labore", "et"}, } - body := NewTableBody().AddStringsRows(tableData...) + body := uxBlock.NewTableBody().AddStringsRows(tableData...) line, err := blocks.Select( ctx, body, - SelectTableHeader(NewTableRow().AddStringCells("header1", "header2", "header3", "header4")), - SelectLabel("Select line"), + uxBlock.SelectTableHeader(uxBlock.NewTableRow().AddStringCells("header1", "header2", "header3", "header4")), + uxBlock.SelectLabel("Select line"), ) if err != nil { return } - blocks.PrintInfoLine("selected", tableData[line[0]][0]) + blocks.PrintInfo(InfoWithValueLine("selected", tableData[line[0]][0])) fmt.Println("========= table selection end =========") fmt.Println("========= print table block =========") - blocks.PrintInfoLine("printing table") - blocks.Table(body, WithTableHeader(NewTableRow().AddStringCells("header1", "header2", "header3", "header4"))) + blocks.PrintInfo(InfoLine("printing table")) + blocks.Table(body, uxBlock.WithTableHeader(uxBlock.NewTableRow().AddStringCells("header1", "header2", "header3", "header4"))) fmt.Println("========= print table block end =========") } @@ -141,7 +146,7 @@ func regSignals(contextCancel func()) { }() } -func createBlocks(contextCancelFunc func()) UxBlocks { +func createBlocks(contextCancelFunc func()) uxBlock.UxBlocks { isTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) outputLogger := logger.NewOutputLogger(logger.OutputConfig{ @@ -157,7 +162,7 @@ func createBlocks(contextCancelFunc func()) UxBlocks { FilePath: "zerops.log", }) - blocks := NewBlock(outputLogger, debugFileLogger, isTerminal, width, contextCancelFunc) + blocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, width, contextCancelFunc) return blocks } diff --git a/src/uxBlock/spinner.go b/src/uxBlock/spinner.go index be4a9b84..64e58e3e 100644 --- a/src/uxBlock/spinner.go +++ b/src/uxBlock/spinner.go @@ -6,6 +6,7 @@ import ( bubblesSpinner "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) func (b *uxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOptions ...SpinnerOption) func() { @@ -17,7 +18,7 @@ func (b *uxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOpti if !b.isTerminal { return func() { for _, spinner := range spinners { - b.PrintLine(spinner.text) + b.PrintInfo(spinner.line) } } } @@ -30,7 +31,7 @@ func (b *uxBlocks) RunSpinners(ctx context.Context, spinners []*Spinner, auxOpti p := tea.NewProgram(model, tea.WithoutSignalHandler(), tea.WithContext(ctx)) go func() { - //nolint:errcheck + //nolint:errcheck // Why: I'm not interest in the error p.Run() if model.canceled { b.ctxCancel() @@ -119,7 +120,7 @@ func (m *spinnerModel) View() string { if m.canceled { s += "canceled\n" } else { - s += spinner.view() + spinner.text + "\n" + s += spinner.view() + spinner.line.String() + "\n" } } @@ -132,26 +133,26 @@ type spinnerConfig struct { type SpinnerOption = func(cfg *spinnerConfig) type Spinner struct { - text string + line styles.Line finished bool spinner bubblesSpinner.Model } -func NewSpinner(text string) *Spinner { +func NewSpinner(line styles.Line) *Spinner { return &Spinner{ - text: text, + line: line, spinner: bubblesSpinner.New(bubblesSpinner.WithSpinner(bubblesSpinner.MiniDot)), } } -func (s *Spinner) SetMessage(text string) *Spinner { - s.text = text +func (s *Spinner) SetMessage(text styles.Line) *Spinner { + s.line = text return s } -func (s *Spinner) Finish(text string) *Spinner { - s.text = text +func (s *Spinner) Finish(text styles.Line) *Spinner { + s.line = text s.finished = true return s diff --git a/src/uxBlock/styles.go b/src/uxBlock/styles.go deleted file mode 100644 index 046f4645..00000000 --- a/src/uxBlock/styles.go +++ /dev/null @@ -1,108 +0,0 @@ -package uxBlock - -import ( - "fmt" - "os" - - "github.com/charmbracelet/lipgloss" -) - -const ( - SuccessIcon = "✅ " - ErrorIcon = "❌ " - SelectionIcon = "❔ " - InfoIcon = "ℹ️" - WarningIcon = "⚠️" -) - -var defaultStyle = lipgloss.NewStyle(). - Renderer(lipgloss.NewRenderer(os.Stdout)) - -var successColor = defaultStyle. - Foreground(lipgloss.CompleteAdaptiveColor{ - Light: lipgloss.CompleteColor{TrueColor: "#00ff5f", ANSI256: "47", ANSI: "0"}, - Dark: lipgloss.CompleteColor{TrueColor: "#00ff5f", ANSI256: "47", ANSI: "0"}, - }). - Bold(false) - -var errorColor = defaultStyle. - Foreground(lipgloss.CompleteAdaptiveColor{ - Light: lipgloss.CompleteColor{TrueColor: "#FF000", ANSI256: "196", ANSI: "0"}, - Dark: lipgloss.CompleteColor{TrueColor: "#FF000", ANSI256: "196", ANSI: "0"}, - }). - Bold(true) - -var warningColor = defaultStyle. - Foreground(lipgloss.CompleteAdaptiveColor{ - Light: lipgloss.CompleteColor{TrueColor: "#ffff87", ANSI256: "228", ANSI: "0"}, - Dark: lipgloss.CompleteColor{TrueColor: "#ffff87", ANSI256: "228", ANSI: "0"}, - }). - Bold(true) - -var infoColor = defaultStyle. - Foreground(lipgloss.CompleteAdaptiveColor{ - Light: lipgloss.CompleteColor{TrueColor: "#00afff", ANSI256: "039", ANSI: "0"}, - Dark: lipgloss.CompleteColor{TrueColor: "#00afff", ANSI256: "039", ANSI: "0"}, - }). - Bold(true) - -func ErrorText(text string) lipgloss.Style { - return errorColor.Copy().SetString(text) -} - -func SuccessText(text string) lipgloss.Style { - return successColor.Copy().SetString(text) -} - -func WarningText(text string) lipgloss.Style { - return warningColor.Copy().SetString(text) -} - -func InfoText(text string) lipgloss.Style { - return infoColor.Copy().SetString(text) -} - -type line struct { - args []interface{} - styles bool -} - -func NewLine(args ...interface{}) line { - return line{ - args: args, - styles: true, - } -} - -func (l line) DisableStyle() line { - l.styles = false - return l -} - -func (l line) Merge(lines ...line) line { - for _, line := range lines { - l.args = append(l.args, line.args...) - } - return l -} - -func (l line) NotEmpty() bool { - return len(l.args) > 0 -} - -func (l line) String() string { - if l.styles { - return fmt.Sprint(l.args...) - } - return fmt.Sprint(removeStyles(l.args)...) -} - -func removeStyles(args []interface{}) []interface{} { - for i, arg := range args { - if typed, ok := arg.(lipgloss.Style); ok { - args[i] = typed.Value() - } - } - - return args -} diff --git a/src/uxBlock/styles/helpers.go b/src/uxBlock/styles/helpers.go new file mode 100644 index 00000000..e3f97991 --- /dev/null +++ b/src/uxBlock/styles/helpers.go @@ -0,0 +1,47 @@ +package styles + +import "github.com/charmbracelet/lipgloss" + +func SuccessLine(text string) Line { + return NewLine(SuccessText(SuccessIcon), " ", SuccessPrefix(), " ", SuccessText(text)) +} + +func InfoWithValueLine(text string, value string) Line { + return NewLine(InfoText(InfoIcon), " ", InfoPrefix(), " ", InfoText(text), ": ", SelectText(value)) +} + +func InfoLine(text string) Line { + return NewLine(InfoText(InfoIcon), " ", InfoPrefix(), " ", InfoText(text)) +} + +func WarningLine(text string) Line { + return NewLine(WarningText(WarningIcon), " ", WarningPrefix(), " ", WarningText(text)) +} + +func ErrorLine(text string) Line { + return NewLine(ErrorText(ErrorIcon), " ", ErrorPrefix(), " ", ErrorText(text)) +} + +func SelectLine(text string) Line { + return NewLine(SelectText(SelectIcon), " ", SelectPrefix(), " ", InfoText(text)) +} + +func ErrorText(text string) lipgloss.Style { + return ErrorColor().SetString(text) +} + +func SuccessText(text string) lipgloss.Style { + return SuccessColor().SetString(text) +} + +func WarningText(text string) lipgloss.Style { + return WarningColor().SetString(text) +} + +func InfoText(text string) lipgloss.Style { + return InfoColor().SetString(text) +} + +func SelectText(text string) lipgloss.Style { + return SelectColor().SetString(text) +} diff --git a/src/uxBlock/styles/line.go b/src/uxBlock/styles/line.go new file mode 100644 index 00000000..48836396 --- /dev/null +++ b/src/uxBlock/styles/line.go @@ -0,0 +1,50 @@ +package styles + +import ( + "fmt" + + "github.com/charmbracelet/lipgloss" +) + +type Line struct { + args []interface{} + styles bool +} + +func NewLine(args ...interface{}) Line { + return Line{ + args: args, + styles: true, + } +} + +func (l Line) DisableStyle() Line { + l.styles = false + return l +} + +func (l Line) Merge(lines ...Line) Line { + for _, line := range lines { + l.args = append(l.args, line.args...) + } + return l +} + +func (l Line) NotEmpty() bool { + return len(l.args) > 0 +} + +func (l Line) String() string { + args := l.args + + for i, arg := range args { + if typed, ok := arg.(lipgloss.Style); ok { + if l.styles { + args[i] = typed.String() + } else { + args[i] = typed.Value() + } + } + } + return fmt.Sprint(args...) +} diff --git a/src/uxBlock/styles/styles.go b/src/uxBlock/styles/styles.go new file mode 100644 index 00000000..6abba119 --- /dev/null +++ b/src/uxBlock/styles/styles.go @@ -0,0 +1,186 @@ +package styles + +import ( + "os" + + "github.com/charmbracelet/lipgloss" +) + +const ( + SuccessIcon = "✔" + ErrorIcon = "✗" + SelectIcon = "➔" + InfoIcon = "➤" + WarningIcon = "!" +) + +var defaultRender = lipgloss.NewRenderer(os.Stdout) + +func defaultStyle() lipgloss.Style { + return lipgloss.NewStyle().Renderer(defaultRender) +} + +func SuccessPrefix() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#FFFFFF", ANSI256: "231", ANSI: "97"}, + Dark: lipgloss.CompleteColor{TrueColor: "#000000", ANSI256: "0", ANSI: "0"}, + }). + Background(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#66bb6a", ANSI256: "114", ANSI: "32"}, + Dark: lipgloss.CompleteColor{TrueColor: "#66bb6a", ANSI256: "114", ANSI: "32"}, + }). + PaddingLeft(1).PaddingRight(1). + SetString("DONE") +} + +func SuccessColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#66bb6a", ANSI256: "114", ANSI: "32"}, + Dark: lipgloss.CompleteColor{TrueColor: "#66bb6a", ANSI256: "114", ANSI: "32"}, + }) +} + +func ErrorPrefix() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#FFFFFF", ANSI256: "231", ANSI: "97"}, + Dark: lipgloss.CompleteColor{TrueColor: "#000000", ANSI256: "0", ANSI: "0"}, + }). + Background(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#ff1b16", ANSI256: "196", ANSI: "91"}, + Dark: lipgloss.CompleteColor{TrueColor: "#ff1b16", ANSI256: "196", ANSI: "91"}, + }). + PaddingLeft(1).PaddingRight(1). + SetString("ERR") +} + +func ErrorColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#ff1b16", ANSI256: "196", ANSI: "91"}, + Dark: lipgloss.CompleteColor{TrueColor: "#ff1b16", ANSI256: "196", ANSI: "91"}, + }) +} + +func WarningPrefix() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#FFFFFF", ANSI256: "231", ANSI: "97"}, + Dark: lipgloss.CompleteColor{TrueColor: "#000000", ANSI256: "0", ANSI: "0"}, + }). + Background(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#ffa726", ANSI256: "216", ANSI: "93"}, + Dark: lipgloss.CompleteColor{TrueColor: "#ffa726", ANSI256: "216", ANSI: "93"}, + }). + PaddingLeft(1).PaddingRight(1). + SetString("WARN") +} + +func WarningColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#ffa726", ANSI256: "216", ANSI: "93"}, + Dark: lipgloss.CompleteColor{TrueColor: "#ffa726", ANSI256: "216", ANSI: "93"}, + }) +} + +func InfoPrefix() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#FFFFFF", ANSI256: "231", ANSI: "97"}, + Dark: lipgloss.CompleteColor{TrueColor: "#000000", ANSI256: "0", ANSI: "0"}, + }). + Background(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#e6e7ec", ANSI256: "231", ANSI: "37"}, + Dark: lipgloss.CompleteColor{TrueColor: "#e6e7ec", ANSI256: "231", ANSI: "37"}, + }). + PaddingLeft(1).PaddingRight(1). + SetString("INFO") +} + +func InfoColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#e6e7ec", ANSI256: "231", ANSI: "37"}, + Dark: lipgloss.CompleteColor{TrueColor: "#e6e7ec", ANSI256: "231", ANSI: "37"}, + }) +} + +func SelectPrefix() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#FFFFFF", ANSI256: "231", ANSI: "97"}, + Dark: lipgloss.CompleteColor{TrueColor: "#000000", ANSI256: "0", ANSI: "0"}, + }). + Background(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#07c", ANSI256: "27", ANSI: "30"}, + Dark: lipgloss.CompleteColor{TrueColor: "#07c", ANSI256: "27", ANSI: "30"}, + }). + PaddingLeft(1).PaddingRight(1). + SetString("SELECT") +} + +func SelectColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#07c", ANSI256: "27", ANSI: "30"}, + Dark: lipgloss.CompleteColor{TrueColor: "#07c", ANSI256: "27", ANSI: "30"}, + }) +} + +func CobraSectionColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#cc0077", ANSI256: "162", ANSI: "31"}, + Dark: lipgloss.CompleteColor{TrueColor: "#cc0077", ANSI256: "162", ANSI: "31"}, + }) +} + +func CobraItemNameColor() lipgloss.Style { + return defaultStyle(). + Foreground(lipgloss.CompleteAdaptiveColor{ + Light: lipgloss.CompleteColor{TrueColor: "#00ccbb", ANSI256: "44", ANSI: "36"}, + Dark: lipgloss.CompleteColor{TrueColor: "#00ccbb", ANSI256: "44", ANSI: "36"}, + }) +} + +func DialogBox() lipgloss.Style { + return defaultStyle(). + Border(lipgloss.RoundedBorder()). + BorderForeground(InfoColor().GetForeground()). + Padding(1, 0). + BorderTop(true). + BorderLeft(true). + BorderRight(true). + BorderBottom(true) +} + +func DialogButton() lipgloss.Style { + return defaultStyle(). + Foreground(InfoPrefix().GetForeground()). + Background(InfoPrefix().GetBackground()). + Padding(0, 3). + MarginRight(2). + MarginTop(1) +} + +func ActiveDialogButton() lipgloss.Style { + return DialogButton(). + Foreground(SelectPrefix(). + GetForeground()). + Background(SelectPrefix().GetBackground()) +} + +func TableRow() lipgloss.Style { + return InfoColor(). + PaddingLeft(1). + PaddingRight(1) +} + +func TableRowActive() lipgloss.Style { + return SelectColor(). + PaddingLeft(1). + PaddingRight(1) +} diff --git a/src/uxBlock/table.go b/src/uxBlock/table.go index 7f2c8008..9f6e7898 100644 --- a/src/uxBlock/table.go +++ b/src/uxBlock/table.go @@ -6,6 +6,7 @@ import ( "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss/table" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) type tableConfig struct { @@ -88,40 +89,19 @@ func (b *uxBlocks) Table(body *TableBody, auxOptions ...TableOption) { opt(&cfg) } - baseStyle := lipgloss.NewStyle().Padding(0, 1) - headerStyle := baseStyle.Copy().Foreground(lipgloss.Color("252")).Bold(true) - - baseStyle.SetString() - t := table.New(). + BorderStyle(styles.InfoColor()). Border(lipgloss.NormalBorder()). - BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("238"))). StyleFunc(func(row, col int) lipgloss.Style { - if row == 0 && cfg.header != nil { - return headerStyle - } - - even := row%2 == 0 - - if even { - return baseStyle.Copy().Foreground(lipgloss.Color("245")) - } - return baseStyle.Copy().Foreground(lipgloss.Color("252")) + return styles.TableRow() }) if cfg.header != nil { - capitalizeHeaders := func(data []string) []string { - for i := range data { - data[i] = strings.ToUpper(data[i]) - } - return data - } - headers := make([]string, len(cfg.header.cells)) for i, header := range cfg.header.cells { - headers[i] = header.Text + headers[i] = strings.ToUpper(header.Text) } - t = t.Headers(capitalizeHeaders(headers)...) + t = t.Headers(headers...) } rows := make([][]string, len(body.rows)) diff --git a/src/uxHelpers/org.go b/src/uxHelpers/org.go index a958263d..7a8b3462 100644 --- a/src/uxHelpers/org.go +++ b/src/uxHelpers/org.go @@ -8,6 +8,7 @@ import ( "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" ) @@ -22,7 +23,7 @@ func PrintOrgSelector( } if len(orgs) == 0 { - uxBlocks.PrintWarningLine(i18n.T(i18n.OrgSelectorListEmpty)) + uxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.OrgSelectorListEmpty))) return nil, nil } diff --git a/src/uxHelpers/project.go b/src/uxHelpers/project.go index 52ac8278..33ebe306 100644 --- a/src/uxHelpers/project.go +++ b/src/uxHelpers/project.go @@ -8,6 +8,7 @@ import ( "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" ) @@ -22,7 +23,7 @@ func PrintProjectSelector( } if len(projects) == 0 { - uxBlocks.PrintWarningLine(i18n.T(i18n.ProjectSelectorListEmpty)) + uxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ProjectSelectorListEmpty))) return nil, nil } diff --git a/src/uxHelpers/service.go b/src/uxHelpers/service.go index b49f3872..86772b67 100644 --- a/src/uxHelpers/service.go +++ b/src/uxHelpers/service.go @@ -8,6 +8,7 @@ import ( "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" ) @@ -23,7 +24,7 @@ func PrintServiceSelector( } if len(services) == 0 { - uxBlocks.PrintWarningLine(i18n.T(i18n.ServiceSelectorListEmpty)) + uxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ServiceSelectorListEmpty))) return nil, nil } diff --git a/src/uxHelpers/spinner.go b/src/uxHelpers/spinner.go index 517f3bd5..2abcdcbd 100644 --- a/src/uxHelpers/spinner.go +++ b/src/uxHelpers/spinner.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" "github.com/zeropsio/zerops-go/dto/input/path" "github.com/zeropsio/zerops-go/types/enum" @@ -21,7 +22,7 @@ func ProcessCheckWithSpinner( ) error { spinners := make([]*uxBlock.Spinner, 0, len(processList)) for _, process := range processList { - spinners = append(spinners, uxBlock.NewSpinner(process.RunningMessage)) + spinners = append(spinners, uxBlock.NewSpinner(styles.NewLine(styles.InfoText(process.RunningMessage)))) } stopFunc := uxBlocks.RunSpinners(ctx, spinners) @@ -39,7 +40,7 @@ func ProcessCheckWithSpinner( err := process.F(ctx) if err != nil { - spinners[i].Finish(uxBlock.NewLine(uxBlock.ErrorIcon, uxBlock.ErrorText(process.ErrorMessageMessage)).String()) + spinners[i].Finish(styles.ErrorLine(process.ErrorMessageMessage)) stopFunc() once.Do(func() { @@ -47,7 +48,7 @@ func ProcessCheckWithSpinner( }) return } - spinners[i].Finish(uxBlock.NewLine(uxBlock.SuccessIcon, uxBlock.SuccessText(process.SuccessMessage)).String()) + spinners[i].Finish(styles.SuccessLine(process.SuccessMessage)) }(i) } diff --git a/src/yamlReader/readYaml.go b/src/yamlReader/readYaml.go index 8c2312f9..a5be0266 100644 --- a/src/yamlReader/readYaml.go +++ b/src/yamlReader/readYaml.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock" + "github.com/zeropsio/zcli/src/uxBlock/styles" ) func ReadContent(uxBlocks uxBlock.UxBlocks, importYamlPath string, workingDir string) ([]byte, error) { @@ -29,7 +30,7 @@ func ReadContent(uxBlocks uxBlock.UxBlocks, importYamlPath string, workingDir st return nil, errors.New(i18n.T(i18n.ImportYamlNotFound)) } - uxBlocks.PrintLine(fmt.Sprintf("%s: %s", i18n.T(i18n.ImportYamlFound), importYamlPath)) + uxBlocks.PrintInfo(styles.InfoLine(fmt.Sprintf("%s: %s", i18n.T(i18n.ImportYamlFound), importYamlPath))) if fileInfo.Size() == 0 { return nil, errors.New(i18n.T(i18n.ImportYamlEmpty)) @@ -48,6 +49,6 @@ func ReadContent(uxBlocks uxBlock.UxBlocks, importYamlPath string, workingDir st return nil, errors.New(i18n.T(i18n.ImportYamlCorrupted)) } - uxBlocks.PrintLine(i18n.T(i18n.ImportYamlOk)) + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ImportYamlOk))) return yamlContent, nil } From 04722aceadb496313f84e049d1dd749f0dbbc1fc Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Wed, 21 Feb 2024 18:56:55 +0100 Subject: [PATCH 09/12] fix helps --- src/cmd/scopeProject.go | 1 + src/cmd/scopeReset.go | 1 + src/cmd/service.go | 2 +- src/cmd/serviceDelete.go | 2 +- src/cmd/serviceDeploy.go | 2 +- src/cmd/serviceList.go | 2 +- src/cmd/serviceLog.go | 2 +- src/cmd/servicePush.go | 2 +- src/cmd/serviceStart.go | 2 +- src/cmd/serviceStop.go | 2 +- src/cmd/status.go | 2 +- src/cmd/statusInfo.go | 2 +- src/cmd/statusShowDebugLogs.go | 2 +- src/cmd/version.go | 2 +- src/cmdBuilder/cmdBuilderBuildCobraCmd.go | 13 +- src/cmdBuilder/cmdBuilderCreateRunFunc.go | 131 +--------------- src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 167 +++++++++++++++++---- src/constants/darwin.go | 14 +- src/constants/linux.go | 14 +- src/constants/windows.go | 14 +- src/constants/zerops.go | 15 +- src/i18n/en.go | 8 +- src/i18n/i18n.go | 5 +- 23 files changed, 207 insertions(+), 200 deletions(-) diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go index 91890fc6..0e5f4b66 100644 --- a/src/cmd/scopeProject.go +++ b/src/cmd/scopeProject.go @@ -19,6 +19,7 @@ func scopeProjectCmd() *cmdBuilder.Cmd { Use("project"). Short(i18n.T(i18n.CmdScopeProject)). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + HelpFlag(i18n.T(i18n.ScopeProjectHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { projectId, projectSet := cmdData.CliStorage.Data().ScopeProjectId.Get() if projectSet { diff --git a/src/cmd/scopeReset.go b/src/cmd/scopeReset.go index 2efdcddc..e32291e5 100644 --- a/src/cmd/scopeReset.go +++ b/src/cmd/scopeReset.go @@ -14,6 +14,7 @@ func scopeResetCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("reset"). Short(i18n.T(i18n.CmdScopeReset)). + HelpFlag(i18n.T(i18n.ScopeResetHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { _, err := cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data { data.ScopeProjectId = uuid.ProjectIdNull{} diff --git a/src/cmd/service.go b/src/cmd/service.go index 88bca53a..785a3ef2 100644 --- a/src/cmd/service.go +++ b/src/cmd/service.go @@ -9,7 +9,7 @@ func serviceCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("service"). Short(i18n.T(i18n.CmdService)). - Short(i18n.T(i18n.ServiceHelp)). + HelpFlag(i18n.T(i18n.ServiceHelp)). AddChildrenCmd(serviceDeleteCmd()). AddChildrenCmd(serviceListCmd()). AddChildrenCmd(serviceLogCmd()). diff --git a/src/cmd/serviceDelete.go b/src/cmd/serviceDelete.go index ef2db851..bb960d58 100644 --- a/src/cmd/serviceDelete.go +++ b/src/cmd/serviceDelete.go @@ -16,7 +16,7 @@ func serviceDeleteCmd() *cmdBuilder.Cmd { ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). - Short(i18n.T(i18n.ServiceDeleteHelp)). + HelpFlag(i18n.T(i18n.ServiceDeleteHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { if !cmdData.Params.GetBool("confirm") { err := uxHelpers.YesNoPromptDestructive(ctx, cmdData.UxBlocks, i18n.T(i18n.ServiceDeleteConfirm, cmdData.Service.Name)) diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go index 1f08bbac..9a1e6e0e 100644 --- a/src/cmd/serviceDeploy.go +++ b/src/cmd/serviceDeploy.go @@ -29,7 +29,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { StringFlag("versionName", "", i18n.T(i18n.BuildVersionName)). StringFlag("zeropsYamlPath", "", i18n.T(i18n.ZeropsYamlLocation)). BoolFlag("deployGitFolder", false, i18n.T(i18n.ZeropsYamlLocation)). - Short(i18n.T(i18n.ServiceDeployHelp)). + HelpFlag(i18n.T(i18n.ServiceDeployHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks diff --git a/src/cmd/serviceList.go b/src/cmd/serviceList.go index 96c2f6f2..df107fb6 100644 --- a/src/cmd/serviceList.go +++ b/src/cmd/serviceList.go @@ -14,7 +14,7 @@ func serviceListCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdProjectList)). ScopeLevel(cmdBuilder.Project). Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). - Short(i18n.T(i18n.ServiceListHelp)). + HelpFlag(i18n.T(i18n.ServiceListHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { err := uxHelpers.PrintServiceList(ctx, cmdData.UxBlocks, cmdData.RestApiClient, *cmdData.Project) if err != nil { diff --git a/src/cmd/serviceLog.go b/src/cmd/serviceLog.go index 2c72556a..abd616d8 100644 --- a/src/cmd/serviceLog.go +++ b/src/cmd/serviceLog.go @@ -25,7 +25,7 @@ func serviceLogCmd() *cmdBuilder.Cmd { StringFlag("formatTemplate", "", i18n.T(i18n.LogFormatTemplateFlag)). BoolFlag("follow", false, i18n.T(i18n.LogFollowFlag)). BoolFlag("showBuildLogs", false, i18n.T(i18n.LogShowBuildFlag)). - Short(i18n.T(i18n.ServiceLogHelp)). + HelpFlag(i18n.T(i18n.ServiceLogHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { handler := serviceLogs.New( serviceLogs.Config{}, diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go index 18579931..b6f94768 100644 --- a/src/cmd/servicePush.go +++ b/src/cmd/servicePush.go @@ -29,7 +29,7 @@ func servicePushCmd() *cmdBuilder.Cmd { StringFlag("source", "", i18n.T(i18n.SourceName)). StringFlag("zeropsYamlPath", "", i18n.T(i18n.ZeropsYamlLocation)). BoolFlag("deployGitFolder", false, i18n.T(i18n.UploadGitFolder)). - Short(i18n.T(i18n.ServicePushHelp)). + HelpFlag(i18n.T(i18n.ServicePushHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { uxBlocks := cmdData.UxBlocks diff --git a/src/cmd/serviceStart.go b/src/cmd/serviceStart.go index da00e65c..da337fe3 100644 --- a/src/cmd/serviceStart.go +++ b/src/cmd/serviceStart.go @@ -15,7 +15,7 @@ func serviceStartCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceStart)). ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg(), cmdBuilder.OptionalArgLabel("{serviceName | serviceId}")). - Short(i18n.T(i18n.ServiceStartHelp)). + HelpFlag(i18n.T(i18n.ServiceStartHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { startServiceResponse, err := cmdData.RestApiClient.PutServiceStackStart( ctx, diff --git a/src/cmd/serviceStop.go b/src/cmd/serviceStop.go index 6e50fe17..015171d9 100644 --- a/src/cmd/serviceStop.go +++ b/src/cmd/serviceStop.go @@ -16,7 +16,7 @@ func serviceStopCmd() *cmdBuilder.Cmd { Short(i18n.T(i18n.CmdServiceStop)). ScopeLevel(cmdBuilder.Service). Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). - Short(i18n.T(i18n.ServiceStopHelp)). + HelpFlag(i18n.T(i18n.ServiceStopHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { stopServiceResponse, err := cmdData.RestApiClient.PutServiceStackStop( ctx, diff --git a/src/cmd/status.go b/src/cmd/status.go index ff547c8e..d38e1ff5 100644 --- a/src/cmd/status.go +++ b/src/cmd/status.go @@ -9,7 +9,7 @@ func statusCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("status"). Short(i18n.T(i18n.CmdStatus)). - Short(i18n.T(i18n.StatusHelp)). + HelpFlag(i18n.T(i18n.StatusHelp)). AddChildrenCmd(statusShowDebugLogsCmd()). AddChildrenCmd(statusInfoCmd()) } diff --git a/src/cmd/statusInfo.go b/src/cmd/statusInfo.go index d26d6e52..2e4094cb 100644 --- a/src/cmd/statusInfo.go +++ b/src/cmd/statusInfo.go @@ -17,7 +17,7 @@ func statusInfoCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("info"). Short(i18n.T(i18n.CmdStatusInfo)). - Short(i18n.T(i18n.StatusInfoHelp)). + HelpFlag(i18n.T(i18n.StatusInfoHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { body := &uxBlock.TableBody{} diff --git a/src/cmd/statusShowDebugLogs.go b/src/cmd/statusShowDebugLogs.go index 70725390..85e06743 100644 --- a/src/cmd/statusShowDebugLogs.go +++ b/src/cmd/statusShowDebugLogs.go @@ -16,7 +16,7 @@ func statusShowDebugLogsCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("show-debug-logs"). Short(i18n.T(i18n.CmdStatusShowDebugLogs)). - Short(i18n.T(i18n.StatusShowDebugLogsHelp)). + HelpFlag(i18n.T(i18n.StatusShowDebugLogsHelp)). GuestRunFunc(func(ctx context.Context, cmdData *cmdBuilder.GuestCmdData) error { logFilePath, err := constants.LogFilePath() if err != nil { diff --git a/src/cmd/version.go b/src/cmd/version.go index cc65075b..b34cc389 100644 --- a/src/cmd/version.go +++ b/src/cmd/version.go @@ -15,7 +15,7 @@ func versionCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("version"). Short(i18n.T(i18n.CmdVersion)). - Short(i18n.T(i18n.VersionHelp)). + HelpFlag(i18n.T(i18n.VersionHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { fmt.Printf("zcli version %s (%s) %s/%s\n", Version, runtime.Version(), runtime.GOOS, runtime.GOARCH) diff --git a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go index b16e5ed8..727706dd 100644 --- a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go +++ b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go @@ -5,10 +5,17 @@ import ( "strings" "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cliStorage" "github.com/zeropsio/zcli/src/params" + "github.com/zeropsio/zcli/src/uxBlock" ) -func (b *CmdBuilder) buildCobraCmd(cmd *Cmd, params *params.Handler) (*cobra.Command, error) { +func (b *CmdBuilder) buildCobraCmd( + cmd *Cmd, + params *params.Handler, + uxBlocks uxBlock.UxBlocks, + cliStorage *cliStorage.Handler, +) (*cobra.Command, error) { cobraCmd := &cobra.Command{ Short: cmd.short, SilenceUsage: cmd.silenceUsage, @@ -52,11 +59,11 @@ func (b *CmdBuilder) buildCobraCmd(cmd *Cmd, params *params.Handler) (*cobra.Com } if cmd.guestRunFunc != nil || cmd.loggedUserRunFunc != nil { - cobraCmd.RunE = b.createCmdRunFunc(cmd, params) + cobraCmd.RunE = b.createCmdRunFunc(cmd, params, uxBlocks, cliStorage) } for _, childrenCmd := range cmd.childrenCmds { - cobraChildrenCmd, err := b.buildCobraCmd(childrenCmd, params) + cobraChildrenCmd, err := b.buildCobraCmd(childrenCmd, params, uxBlocks, cliStorage) if err != nil { return nil, err } diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index 8d13b4cf..ac33bf96 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -1,30 +1,16 @@ package cmdBuilder import ( - "context" "fmt" - "os" - "os/signal" - "syscall" - "github.com/mattn/go-isatty" "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/zeropsio/zcli/src/cliStorage" - "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/entity" - "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/logger" "github.com/zeropsio/zcli/src/params" - "github.com/zeropsio/zcli/src/storage" - "github.com/zeropsio/zcli/src/support" "github.com/zeropsio/zcli/src/uxBlock" - "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/zeropsRestApiClient" - "github.com/zeropsio/zerops-go/apiError" - "golang.org/x/term" - "gopkg.in/yaml.v3" ) type ParamsReader interface { @@ -73,43 +59,19 @@ type LoggedUserCmdData struct { Service *entity.Service } -func (b *CmdBuilder) createCmdRunFunc(cmd *Cmd, params *params.Handler) func(*cobra.Command, []string) error { +func (b *CmdBuilder) createCmdRunFunc( + cmd *Cmd, + params *params.Handler, + uxBlocks uxBlock.UxBlocks, + cliStorage *cliStorage.Handler, +) func(*cobra.Command, []string) error { return func(cobraCmd *cobra.Command, args []string) (err error) { - ctx, cancel := context.WithCancel(context.Background()) - regSignals(cancel) - ctx = support.Context(ctx) - - isTerminal, err := isTerminal() - if err != nil { - return err - } - - width, _, err := term.GetSize(0) - if err != nil { - width = 100 - } - - outputLogger, debugFileLogger := createLoggers(isTerminal) - - uxBlocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, width, cancel) + ctx := cobraCmd.Context() uxBlocks.LogDebug(fmt.Sprintf("Command: %s", cobraCmd.CommandPath())) - defer func() { - if err != nil { - printError(err, uxBlocks) - err = errSkipErrorReporting - } - }() - - // TODO - janhajek move somewhere else? params.InitViper() - cliStorage, err := createCliStorage() - if err != nil { - return err - } - argsMap, err := convertArgs(cmd, args) if err != nil { return err @@ -187,82 +149,3 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { return argsMap, nil } - -func printError(err error, uxBlocks uxBlock.UxBlocks) { - uxBlocks.LogDebug(fmt.Sprintf("error: %+v", err)) - - if userErr := errorsx.AsUserError(err); userErr != nil { - uxBlocks.PrintError(styles.ErrorLine(err.Error())) - return - } - - var apiErr apiError.Error - if errors.As(err, &apiErr) { - uxBlocks.PrintError(styles.ErrorLine(apiErr.GetMessage())) - if apiErr.GetMeta() != nil { - meta, err := yaml.Marshal(apiErr.GetMeta()) - if err != nil { - uxBlocks.PrintError(styles.ErrorLine(fmt.Sprintf("couldn't parse meta of error: %s", apiErr.GetMessage()))) - } - uxBlocks.PrintError(styles.ErrorLine(string(meta))) - } - - return - } - - uxBlocks.PrintError(styles.ErrorLine(err.Error())) -} - -func isTerminal() (bool, error) { - switch TerminalMode(TerminalFlag) { - case TerminalModeAuto: - return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()), nil - case TerminalModeDisabled: - return false, nil - case TerminalModeEnabled: - return true, nil - default: - return false, errors.New(i18n.T(i18n.UnknownTerminalMode, TerminalFlag)) - } -} - -func createLoggers(isTerminal bool) (*logger.Handler, *logger.Handler) { - outputLogger := logger.NewOutputLogger(logger.OutputConfig{ - IsTerminal: isTerminal, - }) - - loggerFilePath, err := constants.LogFilePath() - if err != nil { - outputLogger.Warning(styles.WarningLine(err.Error())) - } - - debugFileLogger := logger.NewDebugFileLogger(logger.DebugFileConfig{ - FilePath: loggerFilePath, - }) - - return outputLogger, debugFileLogger -} - -func regSignals(contextCancel func()) { - sigs := make(chan os.Signal, 1) - - signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) - - go func() { - <-sigs - contextCancel() - }() -} - -func createCliStorage() (*cliStorage.Handler, error) { - filePath, err := constants.CliDataFilePath() - if err != nil { - return nil, err - } - s, err := storage.New[cliStorage.Data]( - storage.Config{ - FilePath: filePath, - }, - ) - return &cliStorage.Handler{Handler: s}, err -} diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go index b4cb3e34..695c1a8d 100644 --- a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -1,55 +1,72 @@ package cmdBuilder import ( + "context" "fmt" + "os" + "os/signal" + "syscall" + "github.com/mattn/go-isatty" "github.com/pkg/errors" "github.com/spf13/cobra" + "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/logger" "github.com/zeropsio/zcli/src/params" + "github.com/zeropsio/zcli/src/storage" + "github.com/zeropsio/zcli/src/support" + "github.com/zeropsio/zcli/src/uxBlock" "github.com/zeropsio/zcli/src/uxBlock/styles" + "github.com/zeropsio/zerops-go/apiError" + "golang.org/x/term" + "gopkg.in/yaml.v3" ) -type TerminalMode string +func (b *CmdBuilder) CreateAndExecuteRootCobraCmd() (err error) { + ctx, cancel := context.WithCancel(context.Background()) + regSignals(cancel) + ctx = support.Context(ctx) -const ( - TerminalModeAuto TerminalMode = "auto" - TerminalModeDisabled TerminalMode = "disabled" - TerminalModeEnabled TerminalMode = "enabled" -) + isTerminal := isTerminal() + + width, _, err := term.GetSize(0) + if err != nil { + width = 100 + } + + outputLogger, debugFileLogger := createLoggers(isTerminal) + + uxBlocks := uxBlock.NewBlock(outputLogger, debugFileLogger, isTerminal, width, cancel) + + defer func() { + if err != nil { + printError(err, uxBlocks) + } + }() + + cliStorage, err := createCliStorage() + if err != nil { + return err + } -var TerminalFlag string - -// Chicken-and-egg problem. -// I would like to log errors at one place after the execution of the root command. -// To do that, I need to know the log file path before the execution. -// To know the log file path, I need to parse the persistent flags. -// But these flags are parsed during the execution of the root command. -// So, I moved the logging inside the root command. -// This way, it logs everything. Except the unknown command error. -// This error needs to be handled here. Simple fmt.Println(err.Error()) is enough. -// But with this line, other errors are logged twice. Once here, once in the root command. -// So, I added a special error to skip the logging after the root command. -var errSkipErrorReporting = errors.New("skipErrorReporting") - -func (b *CmdBuilder) CreateAndExecuteRootCobraCmd() error { rootCmd := createRootCommand() params := params.New() for _, cmd := range b.commands { - cobraCmd, err := b.buildCobraCmd(cmd, params) + cobraCmd, err := b.buildCobraCmd(cmd, params, uxBlocks, cliStorage) if err != nil { return err } rootCmd.AddCommand(cobraCmd) } - err := rootCmd.Execute() + err = rootCmd.ExecuteContext(ctx) if err != nil { - if !errors.Is(err, errSkipErrorReporting) { - fmt.Println(err.Error()) - } + printError(err, uxBlocks) } return nil @@ -62,8 +79,6 @@ func createRootCommand() *cobra.Command { SilenceErrors: true, } - rootCmd.PersistentFlags().StringVar(&TerminalFlag, "terminal", "auto", i18n.T(i18n.TerminalFlag)) - rootCmd.SetHelpTemplate(`` + styles.CobraSectionColor().SetString("Usage:").String() + `{{if .Runnable}} {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} @@ -92,8 +107,104 @@ func createRootCommand() *cobra.Command { ` + styles.CobraSectionColor().SetString("Additional help topics:").String() + `{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} ` + styles.CobraItemNameColor().SetString("{{rpad .CommandPath .CommandPathPadding}}").String() + ` {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} +` + styles.CobraSectionColor().SetString("Global Env Variables:").String() + ` + ` + styles.CobraItemNameColor().SetString(constants.CliLogFilePathEnvVar).String() + ` ` + i18n.T(i18n.CliLogFilePathEnvVar) + ` + ` + styles.CobraItemNameColor().SetString(constants.CliDataFilePathEnvVar).String() + ` ` + i18n.T(i18n.CliDataFilePathEnvVar) + ` + ` + styles.CobraItemNameColor().SetString(constants.CliTerminalMode).String() + ` ` + i18n.T(i18n.CliTerminalModeEnvVar) + ` + Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} `) return rootCmd } + +func printError(err error, uxBlocks uxBlock.UxBlocks) { + uxBlocks.LogDebug(fmt.Sprintf("error: %+v", err)) + + if userErr := errorsx.AsUserError(err); userErr != nil { + uxBlocks.PrintError(styles.ErrorLine(err.Error())) + return + } + + var apiErr apiError.Error + if errors.As(err, &apiErr) { + uxBlocks.PrintError(styles.ErrorLine(apiErr.GetMessage())) + if apiErr.GetMeta() != nil { + meta, err := yaml.Marshal(apiErr.GetMeta()) + if err != nil { + uxBlocks.PrintError(styles.ErrorLine(fmt.Sprintf("couldn't parse meta of error: %s", apiErr.GetMessage()))) + } + uxBlocks.PrintError(styles.ErrorLine(string(meta))) + } + + return + } + + uxBlocks.PrintError(styles.ErrorLine(err.Error())) +} + +type terminalMode string + +const ( + TerminalModeAuto terminalMode = "auto" + TerminalModeDisabled terminalMode = "disabled" + TerminalModeEnabled terminalMode = "enabled" +) + +func isTerminal() bool { + env := os.Getenv(constants.CliTerminalMode) + + switch terminalMode(env) { + case TerminalModeAuto, "": + return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) + case TerminalModeDisabled: + return false + case TerminalModeEnabled: + return true + default: + os.Stdout.WriteString(styles.WarningLine(i18n.T(i18n.UnknownTerminalMode, env)).String()) + + return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) + } +} + +func createLoggers(isTerminal bool) (*logger.Handler, *logger.Handler) { + outputLogger := logger.NewOutputLogger(logger.OutputConfig{ + IsTerminal: isTerminal, + }) + + loggerFilePath, err := constants.LogFilePath() + if err != nil { + outputLogger.Warning(styles.WarningLine(err.Error())) + } + + debugFileLogger := logger.NewDebugFileLogger(logger.DebugFileConfig{ + FilePath: loggerFilePath, + }) + + return outputLogger, debugFileLogger +} + +func regSignals(contextCancel func()) { + sigs := make(chan os.Signal, 1) + + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + contextCancel() + }() +} + +func createCliStorage() (*cliStorage.Handler, error) { + filePath, err := constants.CliDataFilePath() + if err != nil { + return nil, err + } + s, err := storage.New[cliStorage.Data]( + storage.Config{ + FilePath: filePath, + }, + ) + return &cliStorage.Handler{Handler: s}, err +} diff --git a/src/constants/darwin.go b/src/constants/darwin.go index 76bfe572..09c45ca3 100644 --- a/src/constants/darwin.go +++ b/src/constants/darwin.go @@ -10,17 +10,17 @@ import ( func getDataFilePathsReceivers() []pathReceiver { return []pathReceiver{ - receiverFromEnv(cliDataFilePathEnvVar), - receiverFromOsFunc(os.UserConfigDir, zeropsDir, cliDataFileName), - receiverFromOsFunc(os.UserHomeDir, zeropsDir, cliDataFileName), + receiverFromEnv(CliDataFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, ZeropsDir, CliDataFileName), + receiverFromOsFunc(os.UserHomeDir, ZeropsDir, CliDataFileName), } } func getLogFilePathReceivers() []pathReceiver { return []pathReceiver{ - receiverFromEnv(cliLogFilePathEnvVar), - receiverFromPath(path.Join("/usr/local/var/log/", zeropsLogFile)), - receiverFromOsFunc(os.UserConfigDir, zeropsDir, zeropsLogFile), - receiverFromOsFunc(os.UserHomeDir, zeropsDir, zeropsLogFile), + receiverFromEnv(CliLogFilePathEnvVar), + receiverFromPath(path.Join("/usr/local/var/log/", ZeropsLogFile)), + receiverFromOsFunc(os.UserConfigDir, ZeropsDir, ZeropsLogFile), + receiverFromOsFunc(os.UserHomeDir, ZeropsDir, ZeropsLogFile), } } diff --git a/src/constants/linux.go b/src/constants/linux.go index 7836fb3d..04f19886 100644 --- a/src/constants/linux.go +++ b/src/constants/linux.go @@ -10,17 +10,17 @@ import ( func getDataFilePathsReceivers() []pathReceiver { return []pathReceiver{ - receiverFromEnv(cliDataFilePathEnvVar), - receiverFromOsFunc(os.UserConfigDir, zeropsDir, cliDataFileName), - receiverFromOsFunc(os.UserHomeDir, zeropsDir, cliDataFileName), + receiverFromEnv(CliDataFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, ZeropsDir, CliDataFileName), + receiverFromOsFunc(os.UserHomeDir, ZeropsDir, CliDataFileName), } } func getLogFilePathReceivers() []pathReceiver { return []pathReceiver{ - receiverFromEnv(cliLogFilePathEnvVar), - receiverFromPath(path.Join("/var/log/", zeropsLogFile)), - receiverFromOsFunc(os.UserConfigDir, zeropsDir, zeropsLogFile), - receiverFromOsFunc(os.UserHomeDir, zeropsDir, zeropsLogFile), + receiverFromEnv(CliLogFilePathEnvVar), + receiverFromPath(path.Join("/var/log/", ZeropsLogFile)), + receiverFromOsFunc(os.UserConfigDir, ZeropsDir, ZeropsLogFile), + receiverFromOsFunc(os.UserHomeDir, ZeropsDir, ZeropsLogFile), } } diff --git a/src/constants/windows.go b/src/constants/windows.go index 9c20367e..d501bcca 100644 --- a/src/constants/windows.go +++ b/src/constants/windows.go @@ -8,21 +8,21 @@ import ( ) // this is here to make linter happy -var _ = zeropsDir +var _ = ZeropsDir var _ = receiverFromPath func getDataFilePathsReceivers() []pathReceiver { return []pathReceiver{ - receiverFromEnv(cliDataFilePathEnvVar), - receiverFromOsFunc(os.UserConfigDir, "Zerops", cliDataFileName), - receiverFromOsFunc(os.UserHomeDir, "Zerops", cliDataFileName), + receiverFromEnv(CliDataFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, "Zerops", CliDataFileName), + receiverFromOsFunc(os.UserHomeDir, "Zerops", CliDataFileName), } } func getLogFilePathReceivers() []pathReceiver { return []pathReceiver{ - receiverFromEnv(cliLogFilePathEnvVar), - receiverFromOsFunc(os.UserConfigDir, "Zerops", zeropsLogFile), - receiverFromOsFunc(os.UserHomeDir, "Zerops", zeropsLogFile), + receiverFromEnv(CliLogFilePathEnvVar), + receiverFromOsFunc(os.UserConfigDir, "Zerops", ZeropsLogFile), + receiverFromOsFunc(os.UserHomeDir, "Zerops", ZeropsLogFile), } } diff --git a/src/constants/zerops.go b/src/constants/zerops.go index f644c590..78b40206 100644 --- a/src/constants/zerops.go +++ b/src/constants/zerops.go @@ -12,11 +12,12 @@ import ( const ( DefaultRegionUrl = "https://api.app.zerops.io/api/rest/public/region/zcli" - zeropsDir = "zerops" - zeropsLogFile = "zerops.log" - cliDataFileName = "cli.data" - cliDataFilePathEnvVar = "ZEROPS_CLI_DATA_FILE_PATH" - cliLogFilePathEnvVar = "ZEROPS_CLI_LOG_FILE_PATH" + ZeropsDir = "zerops" + ZeropsLogFile = "zerops.log" + CliDataFileName = "cli.data" + CliDataFilePathEnvVar = "ZEROPS_CLI_DATA_FILE_PATH" + CliLogFilePathEnvVar = "ZEROPS_CLI_LOG_FILE_PATH" + CliTerminalMode = "ZEROPS_CLI_TERMINAL_MODE" ) type pathReceiver func() (path string, err error) @@ -30,7 +31,7 @@ func CliDataFilePath() (string, error) { _, err := p() paths = append(paths, err.Error()) } - return "", errors.New(i18n.T(i18n.UnableToWriteCliData, "\n"+strings.Join(paths, "\n"))) + return "", errors.New(i18n.T(i18n.UnableToWriteCliData, "\n"+strings.Join(paths, "\n")+"\n")) } return path, nil } @@ -44,7 +45,7 @@ func LogFilePath() (string, error) { _, err := p() paths = append(paths, err.Error()) } - return "", errors.New(i18n.T(i18n.UnableToWriteLogFile, "\n"+strings.Join(paths, "\n"))) + return "", errors.New(i18n.T(i18n.UnableToWriteLogFile, "\n"+strings.Join(paths, "\n")+"\n")) } return path, nil } diff --git a/src/i18n/en.go b/src/i18n/en.go index 4265068c..b1ba433f 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -92,8 +92,6 @@ var en = map[string]string{ LogFollowFlag: "If set, zCLI will continuously poll for new log messages. By default, the command will exit\nonce there are no more logs to display. To exit from this mode, use Control-C.", LogFormatFlag: "The format of returned log messages. Following formats are supported: \nFULL: This is the default format. Messages will be returned in the complete Syslog format. \nSHORT: Returns only timestamp and log message.\nJSON: Messages will be returned as one JSON object.\nJSONSTREAM: Messages will be returned as stream of JSON objects.", LogFormatTemplateFlag: "Set a custom log format. Can be used only with --format=FULL.\nExample: --formatTemplate=\"{{.timestamp}} {{.severity}} {{.facility}} {{.message}}\".\nSupports standard GoLang template format and functions.", - TerminalFlag: "If enabled provides a rich UI to communicate with a user. Possible values: auto, enabled, disabled. Default value is auto.", - LogFilePathFlag: "Path to a log file. Default value: %s.", ConfirmFlag: "If set, zCLI will not ask for confirmation of destructive operations.", ServiceIdFlag: "If you have access to more than one service, you must specify the service ID for which the\ncommand is to be executed.", ProjectIdFlag: "If you have access to more than one project, you must specify the project ID for which the\ncommand is to be executed.", @@ -219,7 +217,11 @@ var en = map[string]string{ // global // //////////// - UnknownTerminalMode: "Unknown terminal mode: %s", + CliTerminalModeEnvVar: "If enabled provides a rich UI to communicate with a user. Possible values: auto, enabled, disabled. Default value is auto.", + CliLogFilePathEnvVar: "Path to a log file.", + CliDataFilePathEnvVar: "Path to data file.", + + UnknownTerminalMode: "Unknown terminal mode: %s. Falling back to auto-discovery. Possible values: auto, enabled, disabled.", UnableToDecodeJsonFile: "Unable to decode json file: %s", UnableToWriteCliData: "Unable to write zcli data, paths tested: %s", UnableToWriteLogFile: "Unable to write zcli debug log file, paths tested: %s", diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index 9415cf17..08db437a 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -105,8 +105,6 @@ const ( LogShowBuildFlag = "LogShowBuildFlag" LogFormatFlag = "LogFormatFlag" LogFormatTemplateFlag = "LogFormatTemplateFlag" - TerminalFlag = "TerminalFlag" - LogFilePathFlag = "LogFilePathFlag" ConfirmFlag = "ConfirmFlag" ServiceIdFlag = "ServiceIdFlag" ProjectIdFlag = "ProjectIdFlag" @@ -256,6 +254,9 @@ const ( //////////// // global // //////////// + CliTerminalModeEnvVar = "TerminalModeEnv" + CliLogFilePathEnvVar = "CliLogFilePathEnvVar" + CliDataFilePathEnvVar = "CliDataFilePathEnvVar" UnknownTerminalMode = "UnknownTerminalMode" UnableToDecodeJsonFile = "UnableToDecodeJsonFile" From db71360f381b9440c7a6b136a68f11e8707cc8df Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Tue, 5 Mar 2024 21:20:06 +0100 Subject: [PATCH 10/12] update --- go.mod | 26 +++---- go.sum | 57 +++++++-------- src/cliStorage/handler.go | 4 +- src/cmd/login.go | 10 +-- src/cmd/projectDelete.go | 5 +- src/cmd/projectServiceImport.go | 3 +- src/cmd/projectStart.go | 5 +- src/cmd/projectStop.go | 5 +- src/cmd/scope/scope.go | 11 +++ .../scope/scopeProject.go} | 33 ++++++--- .../scope/scopeService.go} | 24 +++++-- src/cmd/scopeProject.go | 10 ++- src/cmd/serviceDelete.go | 5 +- src/cmd/serviceDeploy.go | 5 +- src/cmd/serviceList.go | 7 +- src/cmd/serviceLog.go | 3 +- src/cmd/servicePush.go | 7 +- src/cmd/servicePushDeployShared.go | 4 +- src/cmd/serviceStart.go | 5 +- src/cmd/serviceStop.go | 5 +- src/cmdBuilder/cmd.go | 10 ++- src/cmdBuilder/cmdBuilderBuildCobraCmd.go | 16 ++--- src/cmdBuilder/cmdBuilderCreateRunFunc.go | 35 +++++++--- src/cmdBuilder/cmdBuilderExecuteRootCmd.go | 8 +-- src/cmdBuilder/dependencyTree.go | 49 ------------- src/constants/darwin.go | 11 +++ src/constants/linux.go | 11 +++ src/constants/windows.go | 8 +++ src/constants/zerops.go | 25 ++++--- src/entity/org.go | 2 +- src/entity/vpnKey.go | 13 ++++ src/errorsx/checker.go | 69 +++++++++++++++++++ src/errorsx/{errors.go => userError.go} | 0 src/{params => flagParams}/handler.go | 2 +- src/i18n/en.go | 16 ++++- src/i18n/i18n.go | 14 ++++ src/region/region.go | 29 ++++---- 37 files changed, 359 insertions(+), 193 deletions(-) create mode 100644 src/cmd/scope/scope.go rename src/{cmdBuilder/dependencyTreeProject.go => cmd/scope/scopeProject.go} (67%) rename src/{cmdBuilder/dependencyTreeService.go => cmd/scope/scopeService.go} (68%) delete mode 100644 src/cmdBuilder/dependencyTree.go create mode 100644 src/entity/vpnKey.go create mode 100644 src/errorsx/checker.go rename src/errorsx/{errors.go => userError.go} (100%) rename src/{params => flagParams}/handler.go (99%) diff --git a/go.mod b/go.mod index da70b39a..163cb305 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/zeropsio/zcli go 1.21 -require github.com/zeropsio/zerops-go v1.0.4 +require github.com/zeropsio/zerops-go v1.0.6 require ( github.com/charmbracelet/bubbles v0.18.0 @@ -17,14 +17,15 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.8.4 - golang.org/x/crypto v0.16.0 + golang.org/x/term v0.17.0 golang.org/x/text v0.14.0 + golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/containerd/console v1.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -34,13 +35,13 @@ require ( github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/rivo/uniseg v0.4.6 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect @@ -49,13 +50,12 @@ require ( github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.9.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/go.sum b/go.sum index 6584cc30..b2ca4bf5 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -49,16 +49,16 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= -github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= 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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -66,8 +66,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= -github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -94,7 +94,6 @@ github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMV github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -103,30 +102,26 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zeropsio/zerops-go v1.0.4 h1:FQM1M+/c9GwKezzc6TOvgPl2q3wjem+9JlpWpPQxLgM= -github.com/zeropsio/zerops-go v1.0.4/go.mod h1:Nuqf1xWt53IRLyVoXgR4hF4ICc9jlfOfQgnN3ZhJR3E= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +github.com/zeropsio/zerops-go v1.0.6 h1:UDk1OMu57btlFska//8q2BWilgKD1qLZA5QRtLtY3Ks= +github.com/zeropsio/zerops-go v1.0.6/go.mod h1:Nuqf1xWt53IRLyVoXgR4hF4ICc9jlfOfQgnN3ZhJR3E= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= 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.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -135,11 +130,11 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= @@ -147,11 +142,11 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 h1:CawjfCvYQH2OU3/TnxLx97WDSUDRABfT18pCOYwc2GE= +golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6/go.mod h1:3rxYc4HtVcSG9gVaTs2GEBdehh+sYPOwKtyUWEOTb80= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/src/cliStorage/handler.go b/src/cliStorage/handler.go index cd39b863..d49d16fb 100644 --- a/src/cliStorage/handler.go +++ b/src/cliStorage/handler.go @@ -1,6 +1,7 @@ package cliStorage import ( + "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/region" "github.com/zeropsio/zcli/src/storage" "github.com/zeropsio/zerops-go/types/uuid" @@ -12,6 +13,7 @@ type Handler struct { type Data struct { Token string - RegionData region.Data + RegionData region.RegionItem ScopeProjectId uuid.ProjectIdNull + VpnKeys map[uuid.ProjectId]entity.VpnKey } diff --git a/src/cmd/login.go b/src/cmd/login.go index f6e3a70e..d5f5094c 100644 --- a/src/cmd/login.go +++ b/src/cmd/login.go @@ -39,7 +39,7 @@ func loginCmd() *cmdBuilder.Cmd { return err } - restApiClient := zeropsRestApiClient.NewAuthorizedClient(cmdData.Args["token"][0], reg.RestApiAddress) + restApiClient := zeropsRestApiClient.NewAuthorizedClient(cmdData.Args["token"][0], "https://"+reg.Address) response, err := restApiClient.GetUserInfo(ctx) if err != nil { @@ -69,16 +69,16 @@ func loginCmd() *cmdBuilder.Cmd { func getLoginRegion( ctx context.Context, uxBlocks uxBlock.UxBlocks, - regions []region.Data, + regions []region.RegionItem, selectedRegion string, -) (region.Data, error) { +) (region.RegionItem, error) { if selectedRegion != "" { for _, reg := range regions { if reg.Name == selectedRegion { return reg, nil } } - return region.Data{}, errors.New(i18n.T(i18n.RegionNotFound, selectedRegion)) + return region.RegionItem{}, errors.New(i18n.T(i18n.RegionNotFound, selectedRegion)) } for _, reg := range regions { @@ -103,7 +103,7 @@ func getLoginRegion( uxBlock.SelectTableHeader(header), ) if err != nil { - return region.Data{}, err + return region.RegionItem{}, err } return regions[regionIndex[0]], nil diff --git a/src/cmd/projectDelete.go b/src/cmd/projectDelete.go index 87c68134..9cf092b1 100644 --- a/src/cmd/projectDelete.go +++ b/src/cmd/projectDelete.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/dto/input/path" @@ -14,8 +15,8 @@ func projectDeleteCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("delete"). Short(i18n.T(i18n.CmdProjectDelete)). - ScopeLevel(cmdBuilder.Project). - Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + ScopeLevel(scope.Project). + Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). HelpFlag(i18n.T(i18n.ProjectDeleteHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { diff --git a/src/cmd/projectServiceImport.go b/src/cmd/projectServiceImport.go index 73889886..961d760e 100644 --- a/src/cmd/projectServiceImport.go +++ b/src/cmd/projectServiceImport.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock/styles" @@ -18,7 +19,7 @@ func projectServiceImportCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("service-import"). Short(i18n.T(i18n.CmdServiceImport)). - ScopeLevel(cmdBuilder.Project). + ScopeLevel(scope.Project). Arg(serviceImportArgName). HelpFlag(i18n.T(i18n.ProjectServiceImportHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { diff --git a/src/cmd/projectStart.go b/src/cmd/projectStart.go index 8292d849..4967b509 100644 --- a/src/cmd/projectStart.go +++ b/src/cmd/projectStart.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxHelpers" @@ -13,8 +14,8 @@ func projectStartCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("start"). Short(i18n.T(i18n.CmdProjectStart)). - ScopeLevel(cmdBuilder.Project). - Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + ScopeLevel(scope.Project). + Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). HelpFlag(i18n.T(i18n.ProjectStartHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { startProjectResponse, err := cmdData.RestApiClient.PutProjectStart( diff --git a/src/cmd/projectStop.go b/src/cmd/projectStop.go index d84460da..83e5b364 100644 --- a/src/cmd/projectStop.go +++ b/src/cmd/projectStop.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/dto/input/path" @@ -14,8 +15,8 @@ func projectStopCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("stop"). Short(i18n.T(i18n.CmdProjectStop)). - ScopeLevel(cmdBuilder.Project). - Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + ScopeLevel(scope.Project). + Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). HelpFlag(i18n.T(i18n.ProjectStopHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { stopProjectResponse, err := cmdData.RestApiClient.PutProjectStop( diff --git a/src/cmd/scope/scope.go b/src/cmd/scope/scope.go new file mode 100644 index 00000000..91ce7309 --- /dev/null +++ b/src/cmd/scope/scope.go @@ -0,0 +1,11 @@ +package scope + +var Project *project +var Service *service + +func init() { + Project = &project{} + Service = &service{ + parent: Project, + } +} diff --git a/src/cmdBuilder/dependencyTreeProject.go b/src/cmd/scope/scopeProject.go similarity index 67% rename from src/cmdBuilder/dependencyTreeProject.go rename to src/cmd/scope/scopeProject.go index 4a682270..fff156e2 100644 --- a/src/cmdBuilder/dependencyTreeProject.go +++ b/src/cmd/scope/scopeProject.go @@ -1,28 +1,33 @@ -package cmdBuilder +package scope import ( "context" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/errorCode" "github.com/zeropsio/zerops-go/types/uuid" ) type project struct { - commonDependency } const ProjectArgName = "projectId" -func (p *project) AddCommandFlags(cmd *Cmd) { +func (p *project) GetParent() cmdBuilder.ScopeLevel { + return nil +} + +func (p *project) AddCommandFlags(cmd *cmdBuilder.Cmd) { cmd.StringFlag(ProjectArgName, "", i18n.T(i18n.ProjectIdFlag)) } -func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error { +func (p *project) LoadSelectedScope(ctx context.Context, cmd *cmdBuilder.Cmd, cmdData *cmdBuilder.LoggedUserCmdData) error { infoText := i18n.SelectedProject var project *entity.Project var err error @@ -33,11 +38,11 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *Logg project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) if err != nil { - if errorsx.IsUserError(err) { - cmdData.UxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ScopedProjectNotFound))) - } - - return err + return errorsx.Check( + err, + errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidScopedProjectId)), + errorsx.CheckErrorCode(errorCode.ProjectNotFound, i18n.T(i18n.ScopedProjectNotFound)), + ) } infoText = i18n.ScopedProject @@ -46,7 +51,10 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *Logg if projectId, exists := cmdData.Args[ProjectArgName]; exists { project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(projectId[0])) if err != nil { - return err + return errorsx.Check( + err, + errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidProjectId)), + ) } infoText = i18n.SelectedProject @@ -56,7 +64,10 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *Logg if projectId := cmdData.Params.GetString(ProjectArgName); projectId != "" { project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(projectId)) if err != nil { - return err + return errorsx.Check( + err, + errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidProjectId)), + ) } infoText = i18n.SelectedProject diff --git a/src/cmdBuilder/dependencyTreeService.go b/src/cmd/scope/scopeService.go similarity index 68% rename from src/cmdBuilder/dependencyTreeService.go rename to src/cmd/scope/scopeService.go index d71dc6e2..f65d7ef2 100644 --- a/src/cmdBuilder/dependencyTreeService.go +++ b/src/cmd/scope/scopeService.go @@ -1,10 +1,12 @@ -package cmdBuilder +package scope import ( "context" + "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/entity/repository" + "github.com/zeropsio/zcli/src/errorsx" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" @@ -12,17 +14,21 @@ import ( ) type service struct { - commonDependency + parent cmdBuilder.ScopeLevel +} + +func (s *service) GetParent() cmdBuilder.ScopeLevel { + return s.parent } const ServiceArgName = "serviceIdOrName" const serviceFlagName = "serviceId" -func (s *service) AddCommandFlags(cmd *Cmd) { +func (s *service) AddCommandFlags(cmd *cmdBuilder.Cmd) { cmd.StringFlag(serviceFlagName, "", i18n.T(i18n.ServiceIdFlag)) } -func (s *service) LoadSelectedScope(ctx context.Context, _ *Cmd, cmdData *LoggedUserCmdData) error { +func (s *service) LoadSelectedScope(ctx context.Context, _ *cmdBuilder.Cmd, cmdData *cmdBuilder.LoggedUserCmdData) error { infoText := i18n.SelectedService var service *entity.Service var err error @@ -30,7 +36,10 @@ func (s *service) LoadSelectedScope(ctx context.Context, _ *Cmd, cmdData *Logged if serviceIdOrName, exists := cmdData.Args[ServiceArgName]; exists { service, err = repository.GetServiceByIdOrName(ctx, cmdData.RestApiClient, cmdData.Project.ID, serviceIdOrName[0]) if err != nil { - return err + return errorsx.Check( + err, + errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidServiceIdOrName)), + ) } } @@ -42,7 +51,10 @@ func (s *service) LoadSelectedScope(ctx context.Context, _ *Cmd, cmdData *Logged uuid.ServiceStackId(serviceId), ) if err != nil { - return err + return errorsx.Check( + err, + errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidServiceId)), + ) } } diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go index 0e5f4b66..22dd858c 100644 --- a/src/cmd/scopeProject.go +++ b/src/cmd/scopeProject.go @@ -4,6 +4,7 @@ import ( "context" "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/entity" "github.com/zeropsio/zcli/src/entity/repository" @@ -11,6 +12,7 @@ import ( "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxBlock/styles" "github.com/zeropsio/zcli/src/uxHelpers" + "github.com/zeropsio/zerops-go/errorCode" "github.com/zeropsio/zerops-go/types/uuid" ) @@ -18,17 +20,21 @@ func scopeProjectCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("project"). Short(i18n.T(i18n.CmdScopeProject)). - Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). HelpFlag(i18n.T(i18n.ScopeProjectHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { projectId, projectSet := cmdData.CliStorage.Data().ScopeProjectId.Get() if projectSet { project, err := repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) if err != nil { + err = errorsx.Check( + err, + errorsx.CheckErrorCode(errorCode.ProjectNotFound, i18n.T(i18n.ScopedProjectNotFound)), + ) if !errorsx.IsUserError(err) { return err } - cmdData.UxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.ScopedProjectNotFound))) + cmdData.UxBlocks.PrintWarning(styles.WarningLine(err.Error())) } else { cmdData.UxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(i18n.PreviouslyScopedProject), project.Name.String())) } diff --git a/src/cmd/serviceDelete.go b/src/cmd/serviceDelete.go index bb960d58..f975d1a7 100644 --- a/src/cmd/serviceDelete.go +++ b/src/cmd/serviceDelete.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxHelpers" @@ -13,8 +14,8 @@ func serviceDeleteCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("delete"). Short(i18n.T(i18n.CmdServiceDelete)). - ScopeLevel(cmdBuilder.Service). - Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). + ScopeLevel(scope.Service). + Arg(scope.ServiceArgName, cmdBuilder.OptionalArg()). BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)). HelpFlag(i18n.T(i18n.ServiceDeleteHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { diff --git a/src/cmd/serviceDeploy.go b/src/cmd/serviceDeploy.go index 9a1e6e0e..34720923 100644 --- a/src/cmd/serviceDeploy.go +++ b/src/cmd/serviceDeploy.go @@ -7,6 +7,7 @@ import ( "time" "github.com/zeropsio/zcli/src/archiveClient" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" @@ -22,7 +23,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { Use("deploy"). Short(i18n.T(i18n.CmdDeployDesc)). Long(i18n.T(i18n.CmdDeployDesc)+"\n\n"+i18n.T(i18n.DeployDescLong)+"\n\n"+i18n.T(i18n.DeployHintPush)). - ScopeLevel(cmdBuilder.Service). + ScopeLevel(scope.Service). Arg("pathToFileOrDir", cmdBuilder.ArrayArg()). StringFlag("workingDir", "./", i18n.T(i18n.BuildWorkingDir)). StringFlag("archiveFilePath", "", i18n.T(i18n.BuildArchiveFilePath)). @@ -136,7 +137,7 @@ func serviceDeployCmd() *cmdBuilder.Cmd { Id: appVersion.Id, }, body.PutAppVersionDeploy{ - ConfigContent: types.NewMediumTextNull(base64.StdEncoding.EncodeToString(configContent)), + ZeropsYaml: types.NewMediumTextNull(base64.StdEncoding.EncodeToString(configContent)), }, ) if err != nil { diff --git a/src/cmd/serviceList.go b/src/cmd/serviceList.go index df107fb6..89ccaeeb 100644 --- a/src/cmd/serviceList.go +++ b/src/cmd/serviceList.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxHelpers" @@ -11,9 +12,9 @@ import ( func serviceListCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("list"). - Short(i18n.T(i18n.CmdProjectList)). - ScopeLevel(cmdBuilder.Project). - Arg(cmdBuilder.ProjectArgName, cmdBuilder.OptionalArg()). + Short(i18n.T(i18n.CmdServiceList)). + ScopeLevel(scope.Project). + Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). HelpFlag(i18n.T(i18n.ServiceListHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { err := uxHelpers.PrintServiceList(ctx, cmdData.UxBlocks, cmdData.RestApiClient, *cmdData.Project) diff --git a/src/cmd/serviceLog.go b/src/cmd/serviceLog.go index abd616d8..3d11caa4 100644 --- a/src/cmd/serviceLog.go +++ b/src/cmd/serviceLog.go @@ -4,6 +4,7 @@ import ( "context" "github.com/pkg/errors" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/entity/repository" "github.com/zeropsio/zcli/src/serviceLogs" @@ -17,7 +18,7 @@ func serviceLogCmd() *cmdBuilder.Cmd { Use("log"). Short(i18n.T(i18n.CmdServiceLog)). Long(i18n.T(i18n.CmdServiceLogLong)+i18n.T(i18n.ServiceLogAdditional)). - ScopeLevel(cmdBuilder.Service). + ScopeLevel(scope.Service). IntFlag("limit", 100, i18n.T(i18n.LogLimitFlag)). StringFlag("minimumSeverity", "", i18n.T(i18n.LogMinSeverityFlag)). StringFlag("messageType", "APPLICATION", i18n.T(i18n.LogMsgTypeFlag)). diff --git a/src/cmd/servicePush.go b/src/cmd/servicePush.go index b6f94768..bbdda28d 100644 --- a/src/cmd/servicePush.go +++ b/src/cmd/servicePush.go @@ -7,6 +7,7 @@ import ( "time" "github.com/zeropsio/zcli/src/archiveClient" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/httpClient" "github.com/zeropsio/zcli/src/i18n" @@ -22,7 +23,7 @@ func servicePushCmd() *cmdBuilder.Cmd { Use("push"). Short(i18n.T(i18n.CmdPushDesc)). Long(i18n.T(i18n.CmdPushDesc)+"\n\n"+i18n.T(i18n.PushDescLong)). - ScopeLevel(cmdBuilder.Service). + ScopeLevel(scope.Service). StringFlag("workingDir", "./", i18n.T(i18n.BuildWorkingDir)). StringFlag("archiveFilePath", "", i18n.T(i18n.BuildArchiveFilePath)). StringFlag("versionName", "", i18n.T(i18n.BuildVersionName)). @@ -142,8 +143,8 @@ func servicePushCmd() *cmdBuilder.Cmd { Id: appVersion.Id, }, body.PutAppVersionBuildAndDeploy{ - BuildConfigContent: types.MediumText(base64.StdEncoding.EncodeToString(configContent)), - Source: types.NewStringNull(sourceName), + ZeropsYaml: types.MediumText(base64.StdEncoding.EncodeToString(configContent)), + Source: types.NewStringNull(sourceName), }, ) if err != nil { diff --git a/src/cmd/servicePushDeployShared.go b/src/cmd/servicePushDeployShared.go index 6acc2d11..f4fa4190 100644 --- a/src/cmd/servicePushDeployShared.go +++ b/src/cmd/servicePushDeployShared.go @@ -136,9 +136,9 @@ func validateZeropsYamlContent( yamlContent []byte, ) error { resp, err := restApiClient.PostServiceStackZeropsYamlValidation(ctx, body.ZeropsYamlValidation{ - Name: service.Name, + ServiceStackName: service.Name, ServiceStackTypeId: service.ServiceTypeId, - ZeropsYaml: types.NewText(string(yamlContent)), + ZeropsYaml: types.NewMediumText(string(yamlContent)), }) if err != nil { return err diff --git a/src/cmd/serviceStart.go b/src/cmd/serviceStart.go index da337fe3..5e75140e 100644 --- a/src/cmd/serviceStart.go +++ b/src/cmd/serviceStart.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/uxHelpers" @@ -13,8 +14,8 @@ func serviceStartCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("start"). Short(i18n.T(i18n.CmdServiceStart)). - ScopeLevel(cmdBuilder.Service). - Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg(), cmdBuilder.OptionalArgLabel("{serviceName | serviceId}")). + ScopeLevel(scope.Service). + Arg(scope.ServiceArgName, cmdBuilder.OptionalArg(), cmdBuilder.OptionalArgLabel("{serviceName | serviceId}")). HelpFlag(i18n.T(i18n.ServiceStartHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { startServiceResponse, err := cmdData.RestApiClient.PutServiceStackStart( diff --git a/src/cmd/serviceStop.go b/src/cmd/serviceStop.go index 015171d9..cd9548d3 100644 --- a/src/cmd/serviceStop.go +++ b/src/cmd/serviceStop.go @@ -3,6 +3,7 @@ package cmd import ( "context" + "github.com/zeropsio/zcli/src/cmd/scope" "github.com/zeropsio/zcli/src/cmdBuilder" "github.com/zeropsio/zcli/src/uxHelpers" "github.com/zeropsio/zerops-go/dto/input/path" @@ -14,8 +15,8 @@ func serviceStopCmd() *cmdBuilder.Cmd { return cmdBuilder.NewCmd(). Use("stop"). Short(i18n.T(i18n.CmdServiceStop)). - ScopeLevel(cmdBuilder.Service). - Arg(cmdBuilder.ServiceArgName, cmdBuilder.OptionalArg()). + ScopeLevel(scope.Service). + Arg(scope.ServiceArgName, cmdBuilder.OptionalArg()). HelpFlag(i18n.T(i18n.ServiceStopHelp)). LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { stopServiceResponse, err := cmdData.RestApiClient.PutServiceStackStop( diff --git a/src/cmdBuilder/cmd.go b/src/cmdBuilder/cmd.go index b9f5ad99..fab3fd30 100644 --- a/src/cmdBuilder/cmd.go +++ b/src/cmdBuilder/cmd.go @@ -7,6 +7,12 @@ import ( type loggedUserRunFunc func(ctx context.Context, cmdData *LoggedUserCmdData) error type guestRunFunc func(ctx context.Context, cmdData *GuestCmdData) error +type ScopeLevel interface { + AddCommandFlags(*Cmd) + LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error + GetParent() ScopeLevel +} + type Cmd struct { use string short string @@ -15,7 +21,7 @@ type Cmd struct { guestRunFunc guestRunFunc silenceUsage bool - scopeLevel Dependency + scopeLevel ScopeLevel args []cmdArg flags []cmdFlag @@ -78,7 +84,7 @@ func (cmd *Cmd) SilenceUsage(silenceUsage bool) *Cmd { return cmd } -func (cmd *Cmd) ScopeLevel(scopeLevel Dependency) *Cmd { +func (cmd *Cmd) ScopeLevel(scopeLevel ScopeLevel) *Cmd { cmd.scopeLevel = scopeLevel return cmd } diff --git a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go index 727706dd..01b5d2ac 100644 --- a/src/cmdBuilder/cmdBuilderBuildCobraCmd.go +++ b/src/cmdBuilder/cmdBuilderBuildCobraCmd.go @@ -6,13 +6,13 @@ import ( "github.com/spf13/cobra" "github.com/zeropsio/zcli/src/cliStorage" - "github.com/zeropsio/zcli/src/params" + "github.com/zeropsio/zcli/src/flagParams" "github.com/zeropsio/zcli/src/uxBlock" ) func (b *CmdBuilder) buildCobraCmd( cmd *Cmd, - params *params.Handler, + flagParams *flagParams.Handler, uxBlocks uxBlock.UxBlocks, cliStorage *cliStorage.Handler, ) (*cobra.Command, error) { @@ -34,18 +34,18 @@ func (b *CmdBuilder) buildCobraCmd( } cobraCmd.Use = strings.Join(append([]string{cmd.use}, argNames...), " ") - for _, dep := range getDependencyListFromRoot(cmd.scopeLevel) { + for _, dep := range getScopeListFromRoot(cmd.scopeLevel) { dep.AddCommandFlags(cmd) } for _, flag := range cmd.flags { switch defaultValue := flag.defaultValue.(type) { case string: - params.RegisterString(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) + flagParams.RegisterString(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) case int: - params.RegisterInt(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) + flagParams.RegisterInt(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) case bool: - params.RegisterBool(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) + flagParams.RegisterBool(cobraCmd, flag.name, flag.shorthand, defaultValue, flag.description) default: panic(fmt.Sprintf("unexpected type %T", flag.defaultValue)) } @@ -59,11 +59,11 @@ func (b *CmdBuilder) buildCobraCmd( } if cmd.guestRunFunc != nil || cmd.loggedUserRunFunc != nil { - cobraCmd.RunE = b.createCmdRunFunc(cmd, params, uxBlocks, cliStorage) + cobraCmd.RunE = b.createCmdRunFunc(cmd, flagParams, uxBlocks, cliStorage) } for _, childrenCmd := range cmd.childrenCmds { - cobraChildrenCmd, err := b.buildCobraCmd(childrenCmd, params, uxBlocks, cliStorage) + cobraChildrenCmd, err := b.buildCobraCmd(childrenCmd, flagParams, uxBlocks, cliStorage) if err != nil { return nil, err } diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index ac33bf96..b70a61ec 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -2,15 +2,17 @@ package cmdBuilder import ( "fmt" + "slices" "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/zeropsio/zcli/src/cliStorage" "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zcli/src/flagParams" "github.com/zeropsio/zcli/src/i18n" - "github.com/zeropsio/zcli/src/params" "github.com/zeropsio/zcli/src/uxBlock" "github.com/zeropsio/zcli/src/zeropsRestApiClient" + "github.com/zeropsio/zerops-go/types/uuid" ) type ParamsReader interface { @@ -21,10 +23,10 @@ type ParamsReader interface { type CmdParamReader struct { cobraCmd *cobra.Command - paramsHandler *params.Handler + paramsHandler *flagParams.Handler } -func newCmdParamReader(cobraCmd *cobra.Command, paramsHandler *params.Handler) *CmdParamReader { +func newCmdParamReader(cobraCmd *cobra.Command, paramsHandler *flagParams.Handler) *CmdParamReader { return &CmdParamReader{ cobraCmd: cobraCmd, paramsHandler: paramsHandler, @@ -57,11 +59,13 @@ type LoggedUserCmdData struct { // optional params Project *entity.Project Service *entity.Service + + VpnKeys map[uuid.ProjectId]*entity.VpnKey } func (b *CmdBuilder) createCmdRunFunc( cmd *Cmd, - params *params.Handler, + flagParams *flagParams.Handler, uxBlocks uxBlock.UxBlocks, cliStorage *cliStorage.Handler, ) func(*cobra.Command, []string) error { @@ -70,7 +74,7 @@ func (b *CmdBuilder) createCmdRunFunc( uxBlocks.LogDebug(fmt.Sprintf("Command: %s", cobraCmd.CommandPath())) - params.InitViper() + flagParams.InitViper() argsMap, err := convertArgs(cmd, args) if err != nil { @@ -81,7 +85,7 @@ func (b *CmdBuilder) createCmdRunFunc( CliStorage: cliStorage, UxBlocks: uxBlocks, Args: argsMap, - Params: newCmdParamReader(cobraCmd, params), + Params: newCmdParamReader(cobraCmd, flagParams), } if cmd.loggedUserRunFunc != nil { @@ -96,9 +100,9 @@ func (b *CmdBuilder) createCmdRunFunc( GuestCmdData: guestCmdData, } - cmdData.RestApiClient = zeropsRestApiClient.NewAuthorizedClient(token, storedData.RegionData.RestApiAddress) + cmdData.RestApiClient = zeropsRestApiClient.NewAuthorizedClient(token, "https://"+storedData.RegionData.Address) - for _, dep := range getDependencyListFromRoot(cmd.scopeLevel) { + for _, dep := range getScopeListFromRoot(cmd.scopeLevel) { err := dep.LoadSelectedScope(ctx, cmd, cmdData) if err != nil { return err @@ -149,3 +153,18 @@ func convertArgs(cmd *Cmd, args []string) (map[string][]string, error) { return argsMap, nil } + +func getScopeListFromRoot(dep ScopeLevel) []ScopeLevel { + var list []ScopeLevel + for { + if dep == nil { + break + } + list = append(list, dep) + dep = dep.GetParent() + } + + slices.Reverse(list) + + return list +} diff --git a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go index 695c1a8d..4ae16837 100644 --- a/src/cmdBuilder/cmdBuilderExecuteRootCmd.go +++ b/src/cmdBuilder/cmdBuilderExecuteRootCmd.go @@ -13,9 +13,9 @@ import ( "github.com/zeropsio/zcli/src/cliStorage" "github.com/zeropsio/zcli/src/constants" "github.com/zeropsio/zcli/src/errorsx" + "github.com/zeropsio/zcli/src/flagParams" "github.com/zeropsio/zcli/src/i18n" "github.com/zeropsio/zcli/src/logger" - "github.com/zeropsio/zcli/src/params" "github.com/zeropsio/zcli/src/storage" "github.com/zeropsio/zcli/src/support" "github.com/zeropsio/zcli/src/uxBlock" @@ -52,12 +52,12 @@ func (b *CmdBuilder) CreateAndExecuteRootCobraCmd() (err error) { return err } - rootCmd := createRootCommand() + flagParams := flagParams.New() - params := params.New() + rootCmd := createRootCommand() for _, cmd := range b.commands { - cobraCmd, err := b.buildCobraCmd(cmd, params, uxBlocks, cliStorage) + cobraCmd, err := b.buildCobraCmd(cmd, flagParams, uxBlocks, cliStorage) if err != nil { return err } diff --git a/src/cmdBuilder/dependencyTree.go b/src/cmdBuilder/dependencyTree.go deleted file mode 100644 index 1612123a..00000000 --- a/src/cmdBuilder/dependencyTree.go +++ /dev/null @@ -1,49 +0,0 @@ -package cmdBuilder - -import ( - "context" - "slices" -) - -// TODO - janhajek do we need interface? -type Dependency interface { - AddCommandFlags(*Cmd) - LoadSelectedScope(ctx context.Context, cmd *Cmd, cmdData *LoggedUserCmdData) error - GetParent() Dependency -} - -type commonDependency struct { - parent Dependency -} - -func (c *commonDependency) GetParent() Dependency { - return c.parent -} - -// TODO - janhajek move back cmd? -var Project *project -var Service *service - -func init() { - Project = &project{} - Service = &service{ - commonDependency: commonDependency{ - parent: Project, - }, - } -} - -func getDependencyListFromRoot(dep Dependency) []Dependency { - var list []Dependency - for { - if dep == nil { - break - } - list = append(list, dep) - dep = dep.GetParent() - } - - slices.Reverse(list) - - return list -} diff --git a/src/constants/darwin.go b/src/constants/darwin.go index 09c45ca3..e744a13b 100644 --- a/src/constants/darwin.go +++ b/src/constants/darwin.go @@ -24,3 +24,14 @@ func getLogFilePathReceivers() []pathReceiver { receiverFromOsFunc(os.UserHomeDir, ZeropsDir, ZeropsLogFile), } } + +func getWgConfigFilePathReceivers() []pathReceiver { + return []pathReceiver{ + receiverFromEnv(CliWgConfigPathEnvVar), + receiverFromPath(path.Join("/etc/wireguard/", WgConfigFile)), + receiverFromPath(path.Join("/usr/local/etc/wireguard/", WgConfigFile)), + receiverFromPath(path.Join("/opt/homebrew/etc/wireguard/", WgConfigFile)), + receiverFromOsFunc(os.UserConfigDir, ZeropsDir, WgConfigFile), + receiverFromOsFunc(os.UserHomeDir, ZeropsDir, WgConfigFile), + } +} diff --git a/src/constants/linux.go b/src/constants/linux.go index 04f19886..c824f0b4 100644 --- a/src/constants/linux.go +++ b/src/constants/linux.go @@ -24,3 +24,14 @@ func getLogFilePathReceivers() []pathReceiver { receiverFromOsFunc(os.UserHomeDir, ZeropsDir, ZeropsLogFile), } } + +func getWgConfigFilePathReceivers() []pathReceiver { + return []pathReceiver{ + receiverFromEnv(CliWgConfigPathEnvVar), + receiverFromPath(path.Join("/etc/wireguard/", WgConfigFile)), + receiverFromPath(path.Join("/usr/local/etc/wireguard/", WgConfigFile)), + receiverFromPath(path.Join("/opt/homebrew/etc/wireguard/", WgConfigFile)), + receiverFromOsFunc(os.UserConfigDir, ZeropsDir, WgConfigFile), + receiverFromOsFunc(os.UserHomeDir, ZeropsDir, WgConfigFile), + } +} diff --git a/src/constants/windows.go b/src/constants/windows.go index d501bcca..a7bf82b7 100644 --- a/src/constants/windows.go +++ b/src/constants/windows.go @@ -26,3 +26,11 @@ func getLogFilePathReceivers() []pathReceiver { receiverFromOsFunc(os.UserHomeDir, "Zerops", ZeropsLogFile), } } + +func getWgConfigFilePathReceivers() []pathReceiver { + return []pathReceiver{ + receiverFromEnv(CliWgConfigPathEnvVar), + receiverFromOsFunc(os.UserConfigDir, "Zerops", WgConfigFile), + receiverFromOsFunc(os.UserHomeDir, "Zerops", WgConfigFile), + } +} diff --git a/src/constants/zerops.go b/src/constants/zerops.go index 78b40206..d8f24cf7 100644 --- a/src/constants/zerops.go +++ b/src/constants/zerops.go @@ -14,30 +14,29 @@ const ( DefaultRegionUrl = "https://api.app.zerops.io/api/rest/public/region/zcli" ZeropsDir = "zerops" ZeropsLogFile = "zerops.log" + WgConfigFile = "zerops.conf" CliDataFileName = "cli.data" CliDataFilePathEnvVar = "ZEROPS_CLI_DATA_FILE_PATH" CliLogFilePathEnvVar = "ZEROPS_CLI_LOG_FILE_PATH" + CliWgConfigPathEnvVar = "ZEROPS_WG_CONFIG_FILE_PATH" CliTerminalMode = "ZEROPS_CLI_TERMINAL_MODE" ) type pathReceiver func() (path string, err error) func CliDataFilePath() (string, error) { - pathReceivers := getDataFilePathsReceivers() - path := findFirstWritablePath(pathReceivers) - if path == "" { - paths := make([]string, 0, len(pathReceivers)) - for _, p := range pathReceivers { - _, err := p() - paths = append(paths, err.Error()) - } - return "", errors.New(i18n.T(i18n.UnableToWriteCliData, "\n"+strings.Join(paths, "\n")+"\n")) - } - return path, nil + return checkReceivers(getDataFilePathsReceivers(), i18n.UnableToWriteCliData) } func LogFilePath() (string, error) { - pathReceivers := getLogFilePathReceivers() + return checkReceivers(getLogFilePathReceivers(), i18n.UnableToWriteLogFile) +} + +func WgConfigFilePath() (string, error) { + return checkReceivers(getWgConfigFilePathReceivers(), i18n.UnableToWriteLogFile) +} + +func checkReceivers(pathReceivers []pathReceiver, errorText string) (string, error) { path := findFirstWritablePath(pathReceivers) if path == "" { paths := make([]string, 0, len(pathReceivers)) @@ -45,7 +44,7 @@ func LogFilePath() (string, error) { _, err := p() paths = append(paths, err.Error()) } - return "", errors.New(i18n.T(i18n.UnableToWriteLogFile, "\n"+strings.Join(paths, "\n")+"\n")) + return "", errors.New(i18n.T(errorText, "\n"+strings.Join(paths, "\n")+"\n")) } return path, nil } diff --git a/src/entity/org.go b/src/entity/org.go index 279362b7..d70e049b 100644 --- a/src/entity/org.go +++ b/src/entity/org.go @@ -8,6 +8,6 @@ import ( type Org struct { ID uuid.ClientId - Role enum.ClientUserLightRoleCodeEnum + Role enum.ClientUserRoleCodeEnum Name types.String } diff --git a/src/entity/vpnKey.go b/src/entity/vpnKey.go new file mode 100644 index 00000000..c2136fdd --- /dev/null +++ b/src/entity/vpnKey.go @@ -0,0 +1,13 @@ +package entity + +import ( + "time" + + "github.com/zeropsio/zerops-go/types/uuid" +) + +type VpnKey struct { + Key string + ProjectId uuid.ProjectId + CreatedAt time.Time +} diff --git a/src/errorsx/checker.go b/src/errorsx/checker.go new file mode 100644 index 00000000..4ec98048 --- /dev/null +++ b/src/errorsx/checker.go @@ -0,0 +1,69 @@ +package errorsx + +import ( + "fmt" + + "github.com/pkg/errors" + "github.com/zeropsio/zerops-go/apiError" + "github.com/zeropsio/zerops-go/errorCode" +) + +type check func(err error) error + +func CheckErrorCode(errorCode errorCode.ErrorCode, errMessage string) check { + return func(err error) error { + var apiErr apiError.Error + if errors.As(err, &apiErr) { + if string(errorCode) != apiErr.GetErrorCode() { + return nil + } + + return NewUserError(errMessage, err) + } + + return nil + } +} + +func CheckInvalidUserInput(parameterName string, errMessage string) check { + return func(err error) error { + var apiErr apiError.Error + if errors.As(err, &apiErr) { + if string(errorCode.InvalidUserInput) != apiErr.GetErrorCode() { + return nil + } + + meta, ok := apiErr.GetMeta().([]interface{}) + if !ok { + return nil + } + + for _, metaItem := range meta { + if metaItemTyped, ok := metaItem.(map[string]interface{}); ok { + if parameterValue, ok := metaItemTyped["parameter"]; ok { + if parameterValue == parameterName { + return NewUserError(fmt.Sprintf(errMessage, metaItemTyped["message"]), err) + } + return nil + } + } + } + } + + return nil + } +} + +func Check(err error, checks ...check) error { + if err == nil { + return nil + } + + for _, check := range checks { + if err := check(err); err != nil { + return err + } + } + + return err +} diff --git a/src/errorsx/errors.go b/src/errorsx/userError.go similarity index 100% rename from src/errorsx/errors.go rename to src/errorsx/userError.go diff --git a/src/params/handler.go b/src/flagParams/handler.go similarity index 99% rename from src/params/handler.go rename to src/flagParams/handler.go index e3f25576..803fdd70 100644 --- a/src/params/handler.go +++ b/src/flagParams/handler.go @@ -1,4 +1,4 @@ -package params +package flagParams import ( "fmt" diff --git a/src/i18n/en.go b/src/i18n/en.go index b1ba433f..23f0da06 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -35,6 +35,9 @@ var en = map[string]string{ VersionHelp: "the version command.", BucketCreateHelp: "the bucket create command.", BucketDeleteHelp: "the bucket delete command.", + VpnHelp: "the vpn command.", + VpnConnectHelp: "the vpn connect command.", + VpnDisconnectHelp: "the vpn disconnect command.", // cmd short CmdDeployDesc: "Deploys your application to Zerops.", @@ -57,6 +60,7 @@ var en = map[string]string{ CmdScopeReset: "Resets the scope for project and service.", CmdProjectDelete: "Deletes a project and all of its services.", CmdProjectImport: "Creates a new project with one or more services.", + CmdServiceList: "Lists all services in the project.", CmdServiceImport: "Creates one or more Zerops services in an existing project.", CmdServiceStart: "Starts the Zerops service.", CmdServiceStop: "Stops the Zerops service.", @@ -67,6 +71,9 @@ var en = map[string]string{ CmdBucketS3: "Management directly via S3 API", CmdBucketCreate: "Creates a bucket in an existing object storage.", CmdBucketDelete: "Deletes a bucket from an existing object storage.", + CmdVpn: "VPN commands group", + CmdVpnConnect: "Connects to the Zerops VPN.", + CmdVpnDisconnect: "Disconnects from the Zerops VPN.", // cmd long CmdProjectImportLong: "Creates a new project with one or more services according to the definition in the import YAML file.", @@ -256,9 +263,16 @@ more info: https://docs.zerops.io/documentation/cli/authorization.html`, SelectedProject: "Selected project", SelectedService: "Selected service", ScopedProject: "Scoped project", - ScopedProjectNotFound: "Scoped project wasn't found, Select a different project using `zcli scope project` command.", + ScopedProjectNotFound: "Scoped project wasn't found, select a different project using `zcli scope project` command.", PreviouslyScopedProject: "Previously scoped project", ScopeReset: "Scope was reset", DestructiveOperationConfirmationFailed: "You have to confirm a destructive operation.", + + // errors + ErrorInvalidProjectId: "Invalid project ID [%s]", + ErrorInvalidScopedProjectId: "Invalid ID of the scoped project [%s], select a different project using `zcli scope project` command.", + ErrorInvalidServiceId: "Invalid service ID [%s]", + ErrorInvalidServiceIdOrName: "Invalid service ID or name [%s]", + ErrorProjectIsNotActive: "Project is not active", } diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index 08db437a..d30880b5 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -48,6 +48,9 @@ const ( VersionHelp = "VersionHelp" BucketCreateHelp = "BucketCreateHelp" BucketDeleteHelp = "BucketDeleteHelp" + VpnHelp = "VpnHelp" + VpnConnectHelp = "VpnConnectHelp" + VpnDisconnectHelp = "VpnDisconnectHelp" // cmd short CmdDeployDesc = "CmdDeployDesc" @@ -70,6 +73,7 @@ const ( CmdScopeReset = "CmdScopeReset" CmdProjectDelete = "CmdProjectDelete" CmdProjectImport = "CmdProjectImport" + CmdServiceList = "CmdServiceList" CmdServiceImport = "CmdServiceImport" CmdServiceStart = "CmdServiceStart" CmdServiceStop = "CmdServiceStop" @@ -80,6 +84,9 @@ const ( CmdBucketS3 = "" CmdBucketCreate = "CmdBucketCreate" CmdBucketDelete = "CmdBucketDelete" + CmdVpn = "CmdVpn" + CmdVpnConnect = "CmdVpnConnect" + CmdVpnDisconnect = "CmdVpnDisconnect" // cmd long CmdProjectImportLong = "CmdProjectImportLong" @@ -303,4 +310,11 @@ const ( ProjectNotFound = "ProjectNotFound" ServiceIdInvalidFormat = "ServiceIdInvalidFormat" ServiceNotFound = "ServiceNotFound" + + // errors + ErrorInvalidProjectId = "ErrorInvalidProjectId" + ErrorInvalidScopedProjectId = "ErrorInvalidScopedProjectId" + ErrorInvalidServiceId = "ErrorInvalidServiceId" + ErrorInvalidServiceIdOrName = "ErrorInvalidServiceIdOrName" + ErrorProjectIsNotActive = "ErrorProjectIsNotActive" ) diff --git a/src/region/region.go b/src/region/region.go index 70f234aa..b4707fda 100644 --- a/src/region/region.go +++ b/src/region/region.go @@ -8,14 +8,10 @@ import ( "github.com/zeropsio/zcli/src/httpClient" ) -type Data struct { - Name string `json:"name"` - IsDefault bool `json:"isDefault"` - RestApiAddress string `json:"restApiAddress"` - GrpcApiAddress string `json:"grpcApiAddress"` - VpnApiAddress string `json:"vpnApiAddress"` - CaCertificateUrl string `json:"caCertificateUrl"` - S3StorageAddress string `json:"s3StorageAddress"` +type RegionItem struct { + Name string `json:"name"` + IsDefault bool `json:"isDefault"` + Address string `json:"address"` } type Handler struct { @@ -28,7 +24,7 @@ func New(client *httpClient.Handler) *Handler { } } -func (h *Handler) RetrieveAllFromURL(ctx context.Context, regionURL string) ([]Data, error) { +func (h *Handler) RetrieveAllFromURL(ctx context.Context, regionURL string) ([]RegionItem, error) { resp, err := h.client.Get(ctx, regionURL) if err != nil { return nil, err @@ -49,8 +45,15 @@ func (h *Handler) RetrieveAllFromURL(ctx context.Context, regionURL string) ([]D return regions, nil } -func readRegions(regionFile json.RawMessage) ([]Data, error) { - var regions []Data - err := json.Unmarshal(regionFile, ®ions) - return regions, err +func readRegions(regionFile json.RawMessage) ([]RegionItem, error) { + var regionItemsResponse response + err := json.Unmarshal(regionFile, ®ionItemsResponse) + if err != nil { + return nil, err + } + return regionItemsResponse.Items, err +} + +type response struct { + Items []RegionItem `json:"items"` } From f303620e5cb932d96c09ce7f0c43f9d9fb7ff9f8 Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Tue, 5 Mar 2024 21:24:59 +0100 Subject: [PATCH 11/12] fix lint --- src/errorsx/checker.go | 44 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/errorsx/checker.go b/src/errorsx/checker.go index 4ec98048..46578b99 100644 --- a/src/errorsx/checker.go +++ b/src/errorsx/checker.go @@ -13,38 +13,38 @@ type check func(err error) error func CheckErrorCode(errorCode errorCode.ErrorCode, errMessage string) check { return func(err error) error { var apiErr apiError.Error - if errors.As(err, &apiErr) { - if string(errorCode) != apiErr.GetErrorCode() { - return nil - } - - return NewUserError(errMessage, err) + if !errors.As(err, &apiErr) { + return nil + } + if string(errorCode) != apiErr.GetErrorCode() { + return nil } - return nil + return NewUserError(errMessage, err) } } func CheckInvalidUserInput(parameterName string, errMessage string) check { return func(err error) error { var apiErr apiError.Error - if errors.As(err, &apiErr) { - if string(errorCode.InvalidUserInput) != apiErr.GetErrorCode() { - return nil - } + if !errors.As(err, &apiErr) { + return nil + } - meta, ok := apiErr.GetMeta().([]interface{}) - if !ok { - return nil - } + if string(errorCode.InvalidUserInput) != apiErr.GetErrorCode() { + return nil + } + + meta, ok := apiErr.GetMeta().([]interface{}) + if !ok { + return nil + } - for _, metaItem := range meta { - if metaItemTyped, ok := metaItem.(map[string]interface{}); ok { - if parameterValue, ok := metaItemTyped["parameter"]; ok { - if parameterValue == parameterName { - return NewUserError(fmt.Sprintf(errMessage, metaItemTyped["message"]), err) - } - return nil + for _, metaItem := range meta { + if metaItemTyped, ok := metaItem.(map[string]interface{}); ok { + if parameterValue, ok := metaItemTyped["parameter"]; ok { + if parameterValue == parameterName { + return NewUserError(fmt.Sprintf(errMessage, metaItemTyped["message"]), err) } } } From 2c4ab3f5791277a5df2f9b84837fc39dcaa3a9a8 Mon Sep 17 00:00:00 2001 From: "jan.hajek@zerops.io" Date: Thu, 7 Mar 2024 09:05:28 +0100 Subject: [PATCH 12/12] vpn added --- .golangci.yaml | 1 - go.mod | 2 +- go.sum | 4 +- src/cmd/root.go | 1 + src/cmd/scope/scopeProject.go | 14 +- src/cmd/scope/scopeService.go | 8 +- src/cmd/scopeProject.go | 9 +- src/cmd/vpn.go | 15 ++ src/cmd/vpnConnect.go | 161 ++++++++++++++++++++++ src/cmd/vpnDisconnect.go | 35 +++++ src/cmdBuilder/cmdBuilderCreateRunFunc.go | 3 +- src/errorsx/checker.go | 55 ++++++-- src/i18n/en.go | 7 + src/i18n/i18n.go | 7 + 14 files changed, 286 insertions(+), 36 deletions(-) create mode 100644 src/cmd/vpn.go create mode 100644 src/cmd/vpnConnect.go create mode 100644 src/cmd/vpnDisconnect.go diff --git a/.golangci.yaml b/.golangci.yaml index cd6e5101..75c0664a 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -76,7 +76,6 @@ linters: - misspell - musttag - nakedret - - nestif - nilerr - noctx - nosprintfhostport diff --git a/go.mod b/go.mod index 163cb305..b6fc7716 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/zeropsio/zcli go 1.21 -require github.com/zeropsio/zerops-go v1.0.6 +require github.com/zeropsio/zerops-go v1.0.7 require ( github.com/charmbracelet/bubbles v0.18.0 diff --git a/go.sum b/go.sum index b2ca4bf5..7c90a806 100644 --- a/go.sum +++ b/go.sum @@ -102,8 +102,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zeropsio/zerops-go v1.0.6 h1:UDk1OMu57btlFska//8q2BWilgKD1qLZA5QRtLtY3Ks= -github.com/zeropsio/zerops-go v1.0.6/go.mod h1:Nuqf1xWt53IRLyVoXgR4hF4ICc9jlfOfQgnN3ZhJR3E= +github.com/zeropsio/zerops-go v1.0.7 h1:vtiaSSu3TrC18BlOxH5/PydUk1+BNDjQhhw6S80SCPE= +github.com/zeropsio/zerops-go v1.0.7/go.mod h1:Nuqf1xWt53IRLyVoXgR4hF4ICc9jlfOfQgnN3ZhJR3E= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/src/cmd/root.go b/src/cmd/root.go index 33cb2bdd..5d5fac2f 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -13,6 +13,7 @@ func ExecuteCmd() error { builder.AddCommand(projectCmd()) builder.AddCommand(serviceCmd()) builder.AddCommand(statusCmd()) + builder.AddCommand(vpnCmd()) return builder.CreateAndExecuteRootCobraCmd() } diff --git a/src/cmd/scope/scopeProject.go b/src/cmd/scope/scopeProject.go index fff156e2..80e7eb5f 100644 --- a/src/cmd/scope/scopeProject.go +++ b/src/cmd/scope/scopeProject.go @@ -38,10 +38,10 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *cmdBuilder.Cmd, cm project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) if err != nil { - return errorsx.Check( + return errorsx.Convert( err, - errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidScopedProjectId)), - errorsx.CheckErrorCode(errorCode.ProjectNotFound, i18n.T(i18n.ScopedProjectNotFound)), + errorsx.ConvertInvalidUserInput("id", i18n.T(i18n.ErrorInvalidScopedProjectId)), + errorsx.ConvertErrorCode(errorCode.ProjectNotFound, i18n.T(i18n.ScopedProjectNotFound)), ) } @@ -51,9 +51,9 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *cmdBuilder.Cmd, cm if projectId, exists := cmdData.Args[ProjectArgName]; exists { project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(projectId[0])) if err != nil { - return errorsx.Check( + return errorsx.Convert( err, - errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidProjectId)), + errorsx.ConvertInvalidUserInput("id", i18n.T(i18n.ErrorInvalidProjectId)), ) } @@ -64,9 +64,9 @@ func (p *project) LoadSelectedScope(ctx context.Context, cmd *cmdBuilder.Cmd, cm if projectId := cmdData.Params.GetString(ProjectArgName); projectId != "" { project, err = repository.GetProjectById(ctx, cmdData.RestApiClient, uuid.ProjectId(projectId)) if err != nil { - return errorsx.Check( + return errorsx.Convert( err, - errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidProjectId)), + errorsx.ConvertInvalidUserInput("id", i18n.T(i18n.ErrorInvalidProjectId)), ) } diff --git a/src/cmd/scope/scopeService.go b/src/cmd/scope/scopeService.go index f65d7ef2..f547b36f 100644 --- a/src/cmd/scope/scopeService.go +++ b/src/cmd/scope/scopeService.go @@ -36,9 +36,9 @@ func (s *service) LoadSelectedScope(ctx context.Context, _ *cmdBuilder.Cmd, cmdD if serviceIdOrName, exists := cmdData.Args[ServiceArgName]; exists { service, err = repository.GetServiceByIdOrName(ctx, cmdData.RestApiClient, cmdData.Project.ID, serviceIdOrName[0]) if err != nil { - return errorsx.Check( + return errorsx.Convert( err, - errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidServiceIdOrName)), + errorsx.ConvertInvalidUserInput("id", i18n.T(i18n.ErrorInvalidServiceIdOrName)), ) } } @@ -51,9 +51,9 @@ func (s *service) LoadSelectedScope(ctx context.Context, _ *cmdBuilder.Cmd, cmdD uuid.ServiceStackId(serviceId), ) if err != nil { - return errorsx.Check( + return errorsx.Convert( err, - errorsx.CheckInvalidUserInput("id", i18n.T(i18n.ErrorInvalidServiceId)), + errorsx.ConvertInvalidUserInput("id", i18n.T(i18n.ErrorInvalidServiceId)), ) } } diff --git a/src/cmd/scopeProject.go b/src/cmd/scopeProject.go index 22dd858c..e64437e8 100644 --- a/src/cmd/scopeProject.go +++ b/src/cmd/scopeProject.go @@ -27,14 +27,11 @@ func scopeProjectCmd() *cmdBuilder.Cmd { if projectSet { project, err := repository.GetProjectById(ctx, cmdData.RestApiClient, projectId) if err != nil { - err = errorsx.Check( - err, - errorsx.CheckErrorCode(errorCode.ProjectNotFound, i18n.T(i18n.ScopedProjectNotFound)), - ) - if !errorsx.IsUserError(err) { + if errorsx.Check(err, errorsx.CheckErrorCode(errorCode.ProjectNotFound)) { + cmdData.UxBlocks.PrintWarning(styles.WarningLine(err.Error())) + } else { return err } - cmdData.UxBlocks.PrintWarning(styles.WarningLine(err.Error())) } else { cmdData.UxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(i18n.PreviouslyScopedProject), project.Name.String())) } diff --git a/src/cmd/vpn.go b/src/cmd/vpn.go new file mode 100644 index 00000000..3f7a8bf3 --- /dev/null +++ b/src/cmd/vpn.go @@ -0,0 +1,15 @@ +package cmd + +import ( + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" +) + +func vpnCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("vpn"). + Short(i18n.T(i18n.CmdVpn)). + HelpFlag(i18n.T(i18n.VpnHelp)). + AddChildrenCmd(vpnConnectCmd()). + AddChildrenCmd(vpnDisconnectCmd()) +} diff --git a/src/cmd/vpnConnect.go b/src/cmd/vpnConnect.go new file mode 100644 index 00000000..578e1c5d --- /dev/null +++ b/src/cmd/vpnConnect.go @@ -0,0 +1,161 @@ +package cmd + +import ( + "context" + "os" + "os/exec" + "text/template" + "time" + + "github.com/zeropsio/zcli/src/cliStorage" + "github.com/zeropsio/zcli/src/cmd/scope" + "github.com/zeropsio/zcli/src/cmdRunner" + "github.com/zeropsio/zcli/src/constants" + "github.com/zeropsio/zcli/src/entity" + "github.com/zeropsio/zerops-go/dto/input/body" + "github.com/zeropsio/zerops-go/dto/input/path" + "github.com/zeropsio/zerops-go/types" + "github.com/zeropsio/zerops-go/types/uuid" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" + + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" +) + +func vpnConnectCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("connect"). + Short(i18n.T(i18n.CmdVpnConnect)). + ScopeLevel(scope.Project). + Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()). + HelpFlag(i18n.T(i18n.VpnConnectHelp)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks + + privateKey, err := getOrCreatePrivateVpnKey(cmdData) + if err != nil { + return err + } + + publicKey := privateKey.PublicKey() + + postProjectResponse, err := cmdData.RestApiClient.PostProjectVpn( + ctx, + path.ProjectId{Id: cmdData.Project.ID}, + body.PostProjectVpn{PublicKey: types.String(publicKey.String())}, + ) + if err != nil { + return err + } + + vpnSettings, err := postProjectResponse.Output() + if err != nil { + return err + } + + filePath, err := constants.WgConfigFilePath() + if err != nil { + return err + } + + f, err := os.Create(filePath) + if err != nil { + return err + } + err = func() error { + defer f.Close() + + templ := template.Must(template.New("wg template").Parse(vpnTmpl)) + + return templ.Execute(f, map[string]interface{}{ + "PrivateKey": privateKey.String(), + "PublicKey": vpnSettings.Project.PublicKey, + "AssignedIpv4Address": vpnSettings.Peer.Ipv4.AssignedIpAddress, + "AssignedIpv6Address": vpnSettings.Peer.Ipv6.AssignedIpAddress, + "Ipv4NetworkGateway": vpnSettings.Project.Ipv4.Network.Gateway, + "ProjectIpv4Network": vpnSettings.Project.Ipv4.Network.Network, + "ProjectIpv6Network": vpnSettings.Project.Ipv6.Network.Network, + "Ipv4Network": vpnSettings.Peer.Ipv4.Network.Network, + "Ipv6Network": vpnSettings.Peer.Ipv6.Network.Network, + "ProjectIpv4SharedEndpoint": vpnSettings.Project.Ipv4.SharedEndpoint, + }) + }() + if err != nil { + return err + } + + uxBlocks.PrintInfo(styles.InfoWithValueLine(i18n.T(i18n.VpnConfigSaved), filePath)) + + _, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data { + if data.VpnKeys == nil { + data.VpnKeys = make(map[uuid.ProjectId]entity.VpnKey) + } + data.VpnKeys[cmdData.Project.ID] = entity.VpnKey{ + ProjectId: cmdData.Project.ID, + Key: privateKey.String(), + CreatedAt: time.Now(), + } + + return data + }) + if err != nil { + return err + } + + // TODO - janhajek check if vpn is disconnected + // TODO - janhajek get somehow a meaningful output + // TODO - janhajek check if wg-quick is installed + // TODO - janhajek a configurable path to wg-quick + c := exec.CommandContext(ctx, "wg-quick", "up", filePath) + _, err = cmdRunner.Run(c) + if err != nil { + return err + } + + // TODO - janhajek ping {{.Ipv4NetworkGateway}} + + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.VpnConnected))) + + return nil + }) +} + +func getOrCreatePrivateVpnKey(cmdData *cmdBuilder.LoggedUserCmdData) (wgtypes.Key, error) { + projectId := cmdData.Project.ID + + if vpnKey, exists := cmdData.VpnKeys[projectId]; exists { + wgKey, err := wgtypes.ParseKey(vpnKey.Key) + if err == nil { + return wgKey, nil + } + + cmdData.UxBlocks.PrintWarning(styles.WarningLine(i18n.T(i18n.VpnPrivateKeyCorrupted))) + } + + vpnKey, err := wgtypes.GeneratePrivateKey() + if err != nil { + return wgtypes.Key{}, err + } + + cmdData.UxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.VpnPrivateKeyCreated))) + + return vpnKey, nil +} + +var vpnTmpl = ` +[Interface] +PrivateKey = {{.PrivateKey}} + +Address = {{if .AssignedIpv4Address}}{{.AssignedIpv4Address}}/32{{end}}, {{.AssignedIpv6Address}}/128 +DNS = {{.Ipv4NetworkGateway}}, zerops + +[Peer] +PublicKey = {{.PublicKey}} + +AllowedIPs = {{if .ProjectIpv4Network}}{{.ProjectIpv4Network}},{{end}} {{.ProjectIpv6Network}}, {{if .Ipv4Network}}{{.Ipv4Network}}, {{end}}{{.Ipv6Network}} + +Endpoint = {{.ProjectIpv4SharedEndpoint}} + +PersistentKeepalive = 5 +` diff --git a/src/cmd/vpnDisconnect.go b/src/cmd/vpnDisconnect.go new file mode 100644 index 00000000..bf3ac775 --- /dev/null +++ b/src/cmd/vpnDisconnect.go @@ -0,0 +1,35 @@ +package cmd + +import ( + "context" + "os/exec" + + "github.com/zeropsio/zcli/src/cmdBuilder" + "github.com/zeropsio/zcli/src/cmdRunner" + "github.com/zeropsio/zcli/src/i18n" + "github.com/zeropsio/zcli/src/uxBlock/styles" +) + +func vpnDisconnectCmd() *cmdBuilder.Cmd { + return cmdBuilder.NewCmd(). + Use("disconnect"). + Short(i18n.T(i18n.CmdVpnDisconnect)). + HelpFlag(i18n.T(i18n.VpnDisconnectHelp)). + LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error { + uxBlocks := cmdData.UxBlocks + + // TODO - janhajek check if vpn is connected + // TODO - janhajek get somehow a meaningful output + // TODO - janhajek check if wg-quick is installed + // TODO - janhajek a configurable path to wg-quick + c := exec.CommandContext(ctx, "wg-quick", "down", "zerops") + _, err := cmdRunner.Run(c) + if err != nil { + return err + } + + uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.VpnDisconnected))) + + return nil + }) +} diff --git a/src/cmdBuilder/cmdBuilderCreateRunFunc.go b/src/cmdBuilder/cmdBuilderCreateRunFunc.go index b70a61ec..97c43646 100644 --- a/src/cmdBuilder/cmdBuilderCreateRunFunc.go +++ b/src/cmdBuilder/cmdBuilderCreateRunFunc.go @@ -60,7 +60,7 @@ type LoggedUserCmdData struct { Project *entity.Project Service *entity.Service - VpnKeys map[uuid.ProjectId]*entity.VpnKey + VpnKeys map[uuid.ProjectId]entity.VpnKey } func (b *CmdBuilder) createCmdRunFunc( @@ -98,6 +98,7 @@ func (b *CmdBuilder) createCmdRunFunc( cmdData := &LoggedUserCmdData{ GuestCmdData: guestCmdData, + VpnKeys: storedData.VpnKeys, } cmdData.RestApiClient = zeropsRestApiClient.NewAuthorizedClient(token, "https://"+storedData.RegionData.Address) diff --git a/src/errorsx/checker.go b/src/errorsx/checker.go index 46578b99..09d0ecdd 100644 --- a/src/errorsx/checker.go +++ b/src/errorsx/checker.go @@ -8,10 +8,39 @@ import ( "github.com/zeropsio/zerops-go/errorCode" ) -type check func(err error) error +type convertor func(err error) error +type check func(err error, errMessage string) error -func CheckErrorCode(errorCode errorCode.ErrorCode, errMessage string) check { - return func(err error) error { +func Check(err error, checks ...check) bool { + if err == nil { + return false + } + + for _, check := range checks { + if err := check(err, ""); err != nil { + return true + } + } + + return false +} + +func Convert(err error, convertors ...convertor) error { + if err == nil { + return nil + } + + for _, convertor := range convertors { + if err := convertor(err); err != nil { + return err + } + } + + return err +} + +func CheckErrorCode(errorCode errorCode.ErrorCode) check { + return func(err error, errMessage string) error { var apiErr apiError.Error if !errors.As(err, &apiErr) { return nil @@ -24,8 +53,8 @@ func CheckErrorCode(errorCode errorCode.ErrorCode, errMessage string) check { } } -func CheckInvalidUserInput(parameterName string, errMessage string) check { - return func(err error) error { +func CheckInvalidUserInput(parameterName string) check { + return func(err error, errMessage string) error { var apiErr apiError.Error if !errors.As(err, &apiErr) { return nil @@ -54,16 +83,14 @@ func CheckInvalidUserInput(parameterName string, errMessage string) check { } } -func Check(err error, checks ...check) error { - if err == nil { - return nil +func ConvertErrorCode(errorCode errorCode.ErrorCode, errMessage string) convertor { + return func(err error) error { + return CheckErrorCode(errorCode)(err, errMessage) } +} - for _, check := range checks { - if err := check(err); err != nil { - return err - } +func ConvertInvalidUserInput(parameterName string, errMessage string) convertor { + return func(err error) error { + return CheckInvalidUserInput(parameterName)(err, errMessage) } - - return err } diff --git a/src/i18n/en.go b/src/i18n/en.go index 23f0da06..f9f42cb1 100644 --- a/src/i18n/en.go +++ b/src/i18n/en.go @@ -220,6 +220,13 @@ var en = map[string]string{ // debug logs DebugLogsNotFound: "Debug logs not found", + // vpn + VpnConnected: "VPN connected", + VpnDisconnected: "VPN disconnected", + VpnConfigSaved: "VPN config saved", + VpnPrivateKeyCorrupted: "VPN private key corrupted, a new one will be created", + VpnPrivateKeyCreated: "VPN private key created", + //////////// // global // //////////// diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index d30880b5..c714534a 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -258,6 +258,13 @@ const ( // debug logs DebugLogsNotFound = "DebugLogsNotFound" + // vpn + VpnConnected = "VpnConnected" + VpnDisconnected = "VpnDisconnected" + VpnConfigSaved = "VpnConfigSaved" + VpnPrivateKeyCorrupted = "VpnPrivateKeyCorrupted" + VpnPrivateKeyCreated = "VpnPrivateKeyCreated" + //////////// // global // ////////////