mirror of
				https://github.com/onepanelio/onepanel.git
				synced 2025-10-31 08:46:20 +08:00 
			
		
		
		
	Compare commits
	
		
			196 Commits
		
	
	
		
			v0.13.0-rc
			...
			v0.16.0-rc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | cfe3d57bb7 | ||
|   | 5ada969517 | ||
|   | c5464d7120 | ||
|   | ed4b0ae127 | ||
|   | e43d7d74a1 | ||
|   | 0cf38f8c85 | ||
|   | fd713e0800 | ||
|   | 6af5d5b5b0 | ||
|   | f22c6b051f | ||
|   | cb402b9496 | ||
|   | a00e155afb | ||
|   | 0a73aed929 | ||
|   | 085e2a7427 | ||
|   | 0f0616ec6d | ||
|   | a2fe9f2619 | ||
|   | 212ef7c0de | ||
|   | d3af2059d4 | ||
|   | 89c0f26103 | ||
|   | 37c01428e2 | ||
|   | dc65fc10b9 | ||
|   | 4abe355ef8 | ||
|   | 341a010fc0 | ||
|   | 52ca9663f5 | ||
|   | 173d043074 | ||
|   | 9ddd69bce8 | ||
|   | 7edfc606a0 | ||
|   | d51db584b7 | ||
|   | a79100bdf6 | ||
|   | 8a9637bc22 | ||
|   | a291e08252 | ||
|   | 091e1d7c44 | ||
|   | 3ae2dd8077 | ||
|   | cc919f6d89 | ||
|   | 27bebcbc1d | ||
|   | b296d85c07 | ||
|   | 466a417e60 | ||
|   | bfa4def06b | ||
|   | 4fec204e7f | ||
|   | 363c430703 | ||
|   | f7e48a0be7 | ||
|   | 3f70f26da4 | ||
|   | f7c74ebf13 | ||
|   | a5ec80e586 | ||
|   | a67012f893 | ||
|   | 806d15f4c9 | ||
|   | 74752efd20 | ||
|   | 5e4d5c0242 | ||
|   | c699b5b2ba | ||
|   | 5bd7f222cd | ||
|   | 04a1db0f81 | ||
|   | d4846b521e | ||
|   | 544991117c | ||
|   | 8057098e29 | ||
|   | a4c40dff8b | ||
|   | ccb991207b | ||
|   | 70007d6d23 | ||
|   | af47ffbd2f | ||
|   | 4f28882d05 | ||
|   | d8101bff8e | ||
|   | 0f226eb0b7 | ||
|   | e1c3dc3979 | ||
|   | 7698b705d8 | ||
|   | 7b7142da49 | ||
|   | d903baea00 | ||
|   | 530e24180d | ||
|   | f5fb44c59b | ||
|   | 6d42a44957 | ||
|   | 2fef7d78c1 | ||
|   | b46e7fd3b9 | ||
|   | e5f2f3e937 | ||
|   | af361d5045 | ||
|   | 3e1a4dd313 | ||
|   | d2dfd4cc34 | ||
|   | 2d45b0a015 | ||
|   | cb7bb793e7 | ||
|   | 90f01f8036 | ||
|   | 850b184788 | ||
|   | 875097fed7 | ||
|   | cd28474249 | ||
|   | 855fd43301 | ||
|   | e037d89a0a | ||
|   | 623964dc6b | ||
|   | f6aff415d5 | ||
|   | 316016765d | ||
|   | 8bce73417a | ||
|   | 9c400e82e6 | ||
|   | f9bf162b94 | ||
|   | 91b9fb37c2 | ||
|   | 594390d742 | ||
|   | e3cbbc7d00 | ||
|   | 6d511f7c8e | ||
|   | 717a4bc2e8 | ||
|   | 74bc140107 | ||
|   | a405e8bf46 | ||
|   | 93bdc7cd70 | ||
|   | 3b3784508c | ||
|   | ff0526db9a | ||
|   | 8b35c1709c | ||
|   | 98c086ad1e | ||
|   | e07aebcc3c | ||
|   | 6c1f522921 | ||
|   | 31840afab1 | ||
|   | cf607513aa | ||
|   | 0e35ed2d52 | ||
|   | 5e82311efb | ||
|   | 0bb5ad7f2c | ||
|   | a598b3f620 | ||
|   | a184c294da | ||
|   | b129a1da7d | ||
|   | 7854aa15ca | ||
|   | 7814502404 | ||
|   | 5d6fae152d | ||
|   | e41d5c38af | ||
|   | 0cdb8ffac8 | ||
|   | a274daa811 | ||
|   | 79d4c44817 | ||
|   | 6591d19dae | ||
|   | 4ea8ca8635 | ||
|   | cbc07693bc | ||
|   | c77711b887 | ||
|   | bcbccbe68d | ||
|   | a4b9e9d444 | ||
|   | 7c0b5a06f8 | ||
|   | a756684ae5 | ||
|   | d4f676210e | ||
|   | 83f6ef3e27 | ||
|   | ee29c12eb2 | ||
|   | 6758e260c9 | ||
|   | 5de512136a | ||
|   | 94c5850eda | ||
|   | 50145cccdf | ||
|   | 83acc5a5ce | ||
|   | 19378c62f3 | ||
|   | 0d4f5fbb37 | ||
|   | 43a4d60b5b | ||
|   | 6c85a81709 | ||
|   | e9d8a6ebe0 | ||
|   | c8c0b6ffd4 | ||
|   | 38780c2e08 | ||
|   | e1f8ee846c | ||
|   | 2cc4cbd6f8 | ||
|   | 276aaf6e7a | ||
|   | 6e1a08fdc3 | ||
|   | 7129fdf55f | ||
|   | 00e3247fcd | ||
|   | c26019b4d5 | ||
|   | acadc0c0a7 | ||
|   | 1b97099d11 | ||
|   | c5365975ac | ||
|   | b7d37586a8 | ||
|   | 2bd3c3dde0 | ||
|   | 957313423c | ||
|   | c883f69fc9 | ||
|   | 6c5b6c877e | ||
|   | 67e684a715 | ||
|   | 20c4950b69 | ||
|   | 5e5c3cca67 | ||
|   | 575a33c272 | ||
|   | 8e9b95aa12 | ||
|   | 38f1aafaec | ||
|   | 30ebda4918 | ||
|   | ce972f2988 | ||
|   | ede4c67c8f | ||
|   | cc05c4994c | ||
|   | 68ddec78c8 | ||
|   | c42997a643 | ||
|   | 5bd2feaa86 | ||
|   | de4302d226 | ||
|   | 7150f24631 | ||
|   | 0e1e48dfc8 | ||
|   | dd0f1f7705 | ||
|   | ac589bfb62 | ||
|   | 1d35adbeaa | ||
|   | 2b52f46ba6 | ||
|   | 03f8f47664 | ||
|   | c85496d216 | ||
|   | 5f6415548d | ||
|   | c641c17a8c | ||
|   | 83a2543b13 | ||
|   | e8dae0f2e9 | ||
|   | b85bf4d688 | ||
|   | 7fe0ab2654 | ||
|   | dfa6eb2fe6 | ||
|   | cc2c51ace5 | ||
|   | 897462ede7 | ||
|   | 4e3c24fd89 | ||
|   | 276e105f20 | ||
|   | 656026ac84 | ||
|   | 95bea11e43 | ||
|   | c6f65510d8 | ||
|   | d6e279dde5 | ||
|   | e99b0e943d | ||
|   | 22a7c31f1d | ||
|   | b6c0f24170 | ||
|   | 9c04ee066d | ||
|   | 29c3e808e1 | 
							
								
								
									
										29
									
								
								.github/workflows/push_tag.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								.github/workflows/push_tag.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| name: Publish docker image on tag push | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - '*' | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: olegtarasov/get-tag@v2 | ||||
|         id: tagName | ||||
|       - name: Publish to Registry | ||||
|         uses: elgohr/Publish-Docker-Github-Action@master | ||||
|         with: | ||||
|           name: onepanel/core | ||||
|           username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|           tags: "${{ env.GIT_TAG_NAME }}" | ||||
|       - name: Set Slack Message | ||||
|         run: echo "::set-env name=SLACK_MESSAGE::Tag $GIT_TAG_NAME. Docker Tag onepanel/core:$GIT_TAG_NAME" | ||||
|       - name: Notify Slack Channels | ||||
|         uses: rtCamp/action-slack-notify@v2.0.0 | ||||
|         env: | ||||
|           SLACK_CHANNEL: org | ||||
|           SLACK_ICON: https://avatars1.githubusercontent.com/u/30390575?s=48&v=4 | ||||
|           SLACK_TITLE: New Core Version | ||||
|           SLACK_USERNAME: opBot | ||||
|           SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} | ||||
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							| @@ -33,6 +33,11 @@ docker-build: | ||||
| docker-push: | ||||
| 	docker push onepanel/core:$(COMMIT_HASH) | ||||
|  | ||||
| docker-custom: | ||||
| 	docker build -t onepanel-core . | ||||
| 	docker tag onepanel-core:latest onepanel/core:$(TAG) | ||||
| 	docker push onepanel/core:$(TAG) | ||||
|  | ||||
| docker: docker-build docker-push | ||||
|  | ||||
| run-tests: | ||||
|   | ||||
							
								
								
									
										83
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								README.md
									
									
									
									
									
								
							| @@ -6,60 +6,37 @@ | ||||
| [](https://pypi.org/project/onepanel-sdk/) | ||||
| [](https://docs.onepanel.io) | ||||
| [](https://github.com/onepanelio/core/issues) | ||||
| [](https://onepanel-ce.slack.com/join/shared_invite/zt-eyjnwec0-nLaHhjif9Y~gA05KuX6AUg#/) | ||||
| [](https://join.slack.com/t/onepanel-ce/shared_invite/zt-eyjnwec0-nLaHhjif9Y~gA05KuX6AUg) | ||||
| [](https://opensource.org/licenses/Apache-2.0) | ||||
|  | ||||
| Production scale, Kubernetes-native vision AI platform, with fully integrated components for model building, automated labeling, data processing and model training pipelines. | ||||
| Production scale vision AI platform with fully integrated components for model building, automated labeling, data processing and model training pipelines. | ||||
|  | ||||
| <img width="100%" src="img/onepanel.gif"> | ||||
|  | ||||
| ## Why Onepanel? | ||||
|  | ||||
| -  End-to-end workflow and infrastructure automation for production scale vision AI | ||||
| -  Automatic resource management and on-demand scaling of CPU and GPU nodes | ||||
| -  Easily scale your data processing and training pipelines to multiple nodes | ||||
| -  Collaborate on all your deep learning tools and workflows through a unified web interface and SDKs | ||||
| -  End-to-end automation for production scale vision AI pipelines | ||||
| -  Best of breed, open source deep learning tools seamlessly integrated in one unified platform | ||||
| -  Infrastructure automation so you can easily scale your data processing and training pipelines to multiple nodes | ||||
| -  Customizable, reproducible and version controlled tooling and pipeline templates | ||||
| -  Scalability, flexibility and resiliency of Kubernetes without the deployment and configuration complexities | ||||
|  | ||||
| ## Features | ||||
| <table> | ||||
|   <tr> | ||||
|     <td width="50%" align="center"> | ||||
|       <h3>Image and video annotation with automatic annotation</h3> | ||||
|       <img width="100%" src="img/auto-annotation.gif"> | ||||
|       <p> | ||||
|         Annotate images and video with automatic annotation of bounding boxes and polygon masks, integrated with training pipelines to iteratively improve models for pre-annotation and inference | ||||
|       </p> | ||||
|     </td> | ||||
|     <td width="50%" align="center"> | ||||
|       <h3>JupyterLab with TensorFlow, PyTorch and GPU support</h3> | ||||
|       <img width="100%" src="img/jupyterlab.gif"> | ||||
|       <p> | ||||
|         JupyterLab configured with extensions for debugging, Git/GitHub, notebook diffing and TensorBoard and support for Conda, OpenCV, Tensorflow and PyTorch with GPU and <a href="https://github.com/onepanelio/templates/tree/master/workspaces/jupyterlab">much more</a> | ||||
|       </p> | ||||
|     </td> | ||||
|   </tr> | ||||
|   <tr> | ||||
|     <td width="50%" align="center"> | ||||
|       <h3>Auto scaling, distributed and parallel data processing and training pipelines</h3> | ||||
|       <img width="100%" src="img/pipelines.gif"> | ||||
|       <p> | ||||
|         Build fully reproducible, distributed and parallel data processing and training pipelines with real-time logs and output snapshots | ||||
|       </p> | ||||
|     </td> | ||||
|     <td width="50%" align="center"> | ||||
|       <h3>Version controlled pipelines and environments as code</h3> | ||||
|       <img width="100%" src="img/tools.gif"> | ||||
|       <p> | ||||
|         Bring your own IDEs, annotation tools and pipelines with a version controlled YAML and Docker based template engine | ||||
|       </p> | ||||
|     </td> | ||||
|   </tr> | ||||
| </table> | ||||
|  | ||||
| -  Annotate images and video with automatic annotation of bounding boxes and polygon masks, fully integrated with data processing and training pipelines. | ||||
| -  JupyterLab configured with extensions for TensorBoard, Git/GitHub, debugging, notebook diffing and support for Conda, OpenCV, Tensorflow and PyTorch with GPU. | ||||
| -  Build fully reproducible, distributed and parallel data processing and training pipelines with real-time logs and output snapshots. | ||||
| -  Bring your own IDEs, annotation tools and pipelines with a version controlled YAML and Docker based template engine. | ||||
| -  Track and visualize model metrics and experiments with TensorBoard or bring your own experiment tracking tools. | ||||
| -  Access and share tools like AirSim, Carla, Gazebo or OpenAI Gym through your browser with VNC enabled workspaces. | ||||
| -  Extend Onepanel with powerful REST APIs and SDKs to further automate your pipelines and environments. | ||||
| -  Workflows, environments and infrastructure are all defined as code and version controlled, making them reproducible and portable. | ||||
| -  Powered by Kubernetes so you can deploy anywhere Kubernetes can run. | ||||
| -  Extend Onepanel with powerful REST APIs and SDKs to further automate your workflows. | ||||
|  | ||||
| ## Online demo | ||||
| We have created an [online demo environment](https://onepanel.typeform.com/to/kQfDX5Vf?product=github) so that you can quickly try Onepanel. | ||||
|  | ||||
| Note that this is a shared demo environment with the following restrictions: | ||||
|  | ||||
| - Data is reset every few hours | ||||
| - One type of node pool (machine type) with a limit of 5 concurrent nodes | ||||
| - Certain actions may be restricted | ||||
|  | ||||
| ## Quick start | ||||
| See [quick start guide](https://docs.onepanel.ai/docs/getting-started/quickstart) to get started with the platform of your choice. | ||||
| @@ -74,17 +51,17 @@ See [documentation](https://docs.onepanel.ai) to get started or for more detaile | ||||
|  | ||||
| To submit a feature request, report a bug or documentation issue, please open a GitHub [pull request](https://github.com/onepanelio/core/pulls) or [issue](https://github.com/onepanelio/core/issues). | ||||
|  | ||||
| For help, questions, release announcements and contribution discussions, join us on [Slack](https://join.slack.com/t/onepanel-ce/shared_invite/zt-eyjnwec0-nLaHhjif9Y~gA05KuX6AUg). | ||||
| For help, questions, release announcements and contribution discussions, join us on [Slack](https://join.slack.com/t/onepanel-ce/shared_invite/zt-eyjnwec0-nLaHhjif9Y~gA05KuX6AUg) or [GitHub discussions](https://github.com/onepanelio/core/discussions). | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| Onepanel is modular and consists of the following repositories: | ||||
|  | ||||
| [Core API](https://github.com/onepanelio/core/) (this repository) - Code base for backend (Go)\ | ||||
| [Core UI](https://github.com/onepanelio/core-ui/) - Code base for UI (Angular + TypeScript)\ | ||||
| [CLI](https://github.com/onepanelio/cli/) - Code base for Go CLI for installation and management (Go)\ | ||||
| [Manifests](https://github.com/onepanelio/core-ui/) - Kustomize manifests used by CLI for installation and management (YAML)\ | ||||
| [Python SDK](https://github.com/onepanelio/python-sdk/) - Python SDK code and documentation\ | ||||
| [Backend](https://github.com/onepanelio/core/) (this repository) - Code base for backend (Go)\ | ||||
| [Frontend](https://github.com/onepanelio/core-ui/) - Code base for frontend (Angular + TypeScript)\ | ||||
| [CLI](https://github.com/onepanelio/cli/) - Code base for installation and management CLI (Go)\ | ||||
| [Manifests](https://github.com/onepanelio/core-ui/) - Kustomize manifests used by installation and management CLI (YAML)\ | ||||
| [Python SDK](https://github.com/onepanelio/python-sdk/) - Python SDK code and documentation (Python)\ | ||||
| [Templates](https://github.com/onepanelio/templates) - Various Workspace, Workflow, Task and Sidecar Templates\ | ||||
| [Documentation](https://github.com/onepanelio/core-docs/) - The repository for documentation site\ | ||||
| [API Documentation](https://github.com/onepanelio/core-api-docs/) - API documentation if you choose to use the API directly | ||||
| @@ -97,8 +74,8 @@ Onepanel seamlessly integrates the following excellent open source projects. We | ||||
|  | ||||
| [Argo](https://github.com/argoproj/argo)\ | ||||
| [CVAT](https://github.com/opencv/cvat)\ | ||||
| [JupyterLab](https://github.com/jupyterlab/jupyterlab) | ||||
|  | ||||
| [JupyterLab](https://github.com/jupyterlab/jupyterlab)\ | ||||
| [NNI](https://github.com/microsoft/nni) | ||||
|  | ||||
| ## License | ||||
| Onepanel is licensed under [Apache 2.0](https://github.com/onepanelio/core/blob/master/LICENSE). | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   "info": { | ||||
|     "title": "Onepanel", | ||||
|     "description": "Onepanel API", | ||||
|     "version": "0.13.0", | ||||
|     "version": "0.16.0", | ||||
|     "contact": { | ||||
|       "name": "Onepanel project", | ||||
|       "url": "https://github.com/onepanelio/core" | ||||
| @@ -54,6 +54,39 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/auth/get_access_token": { | ||||
|       "post": { | ||||
|         "operationId": "GetAccessToken", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/GetAccessTokenResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "body", | ||||
|             "in": "body", | ||||
|             "required": true, | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/GetAccessTokenRequest" | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "AuthService" | ||||
|         ], | ||||
|         "security": [] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/auth/token": { | ||||
|       "post": { | ||||
|         "operationId": "IsValidToken", | ||||
| @@ -77,7 +110,7 @@ | ||||
|             "in": "body", | ||||
|             "required": true, | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/TokenWrapper" | ||||
|               "$ref": "#/definitions/IsValidTokenRequest" | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
| @@ -108,6 +141,54 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/labels/{namespace}/{resource}/labels": { | ||||
|       "get": { | ||||
|         "operationId": "GetAvailableLabels", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/GetLabelsResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "resource", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "keyLike", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "skipKeys", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "LabelService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/namespaces": { | ||||
|       "get": { | ||||
|         "operationId": "ListNamespaces", | ||||
| @@ -1159,6 +1240,92 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workflow_executions/{uid}/metric": { | ||||
|       "post": { | ||||
|         "operationId": "AddWorkflowExecutionMetrics", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/WorkflowExecutionsMetricsResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "uid", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "body", | ||||
|             "in": "body", | ||||
|             "required": true, | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/AddWorkflowExecutionsMetricsRequest" | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "WorkflowService" | ||||
|         ] | ||||
|       }, | ||||
|       "put": { | ||||
|         "operationId": "UpdateWorkflowExecutionMetrics", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/WorkflowExecutionsMetricsResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "uid", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "body", | ||||
|             "in": "body", | ||||
|             "required": true, | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/UpdateWorkflowExecutionsMetricsRequest" | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "WorkflowService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workflow_executions/{uid}/pods/{podName}/containers/{containerName}/logs": { | ||||
|       "get": { | ||||
|         "operationId": "GetWorkflowExecutionLogs", | ||||
| @@ -2737,6 +2904,27 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "AddWorkflowExecutionsMetricsRequest": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "namespace": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "uid": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "override": { | ||||
|           "type": "boolean", | ||||
|           "format": "boolean" | ||||
|         }, | ||||
|         "metrics": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/Metric" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "ArchiveWorkflowTemplateResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -2883,6 +3071,31 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetAccessTokenRequest": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "username": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "token": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetAccessTokenResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "domain": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "accessToken": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "username": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetConfigResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -2967,11 +3180,28 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "IsValidTokenRequest": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "username": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "token": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "IsValidTokenResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "domain": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "token": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "username": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -3394,14 +3624,6 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "TokenWrapper": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "token": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "UpdateSecretKeyValueResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -3411,6 +3633,23 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "UpdateWorkflowExecutionsMetricsRequest": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "namespace": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "uid": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "metrics": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/Metric" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "UpdateWorkspaceBody": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -3469,6 +3708,12 @@ | ||||
|         }, | ||||
|         "metadata": { | ||||
|           "$ref": "#/definitions/WorkflowExecutionMetadata" | ||||
|         }, | ||||
|         "metrics": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/Metric" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -3516,6 +3761,17 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "WorkflowExecutionsMetricsResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "metrics": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/Metric" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "WorkflowTemplate": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|   | ||||
							
								
								
									
										608
									
								
								api/auth.pb.go
									
									
									
									
									
								
							
							
						
						
									
										608
									
								
								api/auth.pb.go
									
									
									
									
									
								
							| @@ -9,7 +9,7 @@ package api | ||||
| import ( | ||||
| 	context "context" | ||||
| 	proto "github.com/golang/protobuf/proto" | ||||
| 	_ "github.com/golang/protobuf/ptypes/empty" | ||||
| 	_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" | ||||
| 	_ "google.golang.org/genproto/googleapis/api/annotations" | ||||
| 	grpc "google.golang.org/grpc" | ||||
| 	codes "google.golang.org/grpc/codes" | ||||
| @@ -31,6 +31,124 @@ const ( | ||||
| // of the legacy proto package is being used. | ||||
| const _ = proto.ProtoPackageIsVersion4 | ||||
|  | ||||
| type IsValidTokenRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` | ||||
| 	Token    string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) Reset() { | ||||
| 	*x = IsValidTokenRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[0] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*IsValidTokenRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsValidTokenRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_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 IsValidTokenRequest.ProtoReflect.Descriptor instead. | ||||
| func (*IsValidTokenRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{0} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) GetUsername() string { | ||||
| 	if x != nil { | ||||
| 		return x.Username | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) GetToken() string { | ||||
| 	if x != nil { | ||||
| 		return x.Token | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type IsValidTokenResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Domain   string `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"` | ||||
| 	Token    string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` | ||||
| 	Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) Reset() { | ||||
| 	*x = IsValidTokenResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[1] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*IsValidTokenResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsValidTokenResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_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 IsValidTokenResponse.ProtoReflect.Descriptor instead. | ||||
| func (*IsValidTokenResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{1} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) GetDomain() string { | ||||
| 	if x != nil { | ||||
| 		return x.Domain | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) GetToken() string { | ||||
| 	if x != nil { | ||||
| 		return x.Token | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) GetUsername() string { | ||||
| 	if x != nil { | ||||
| 		return x.Username | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type IsAuthorized struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -46,7 +164,7 @@ type IsAuthorized struct { | ||||
| func (x *IsAuthorized) Reset() { | ||||
| 	*x = IsAuthorized{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[0] | ||||
| 		mi := &file_auth_proto_msgTypes[2] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -59,7 +177,7 @@ func (x *IsAuthorized) String() string { | ||||
| func (*IsAuthorized) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsAuthorized) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[0] | ||||
| 	mi := &file_auth_proto_msgTypes[2] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -72,7 +190,7 @@ func (x *IsAuthorized) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsAuthorized.ProtoReflect.Descriptor instead. | ||||
| func (*IsAuthorized) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{0} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{2} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) GetNamespace() string { | ||||
| @@ -121,7 +239,7 @@ type IsAuthorizedRequest struct { | ||||
| func (x *IsAuthorizedRequest) Reset() { | ||||
| 	*x = IsAuthorizedRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[1] | ||||
| 		mi := &file_auth_proto_msgTypes[3] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -134,7 +252,7 @@ func (x *IsAuthorizedRequest) String() string { | ||||
| func (*IsAuthorizedRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsAuthorizedRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[1] | ||||
| 	mi := &file_auth_proto_msgTypes[3] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -147,7 +265,7 @@ func (x *IsAuthorizedRequest) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsAuthorizedRequest.ProtoReflect.Descriptor instead. | ||||
| func (*IsAuthorizedRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{1} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{3} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) GetIsAuthorized() *IsAuthorized { | ||||
| @@ -168,7 +286,7 @@ type IsAuthorizedResponse struct { | ||||
| func (x *IsAuthorizedResponse) Reset() { | ||||
| 	*x = IsAuthorizedResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[2] | ||||
| 		mi := &file_auth_proto_msgTypes[4] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -181,7 +299,7 @@ func (x *IsAuthorizedResponse) String() string { | ||||
| func (*IsAuthorizedResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsAuthorizedResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[2] | ||||
| 	mi := &file_auth_proto_msgTypes[4] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -194,7 +312,7 @@ func (x *IsAuthorizedResponse) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsAuthorizedResponse.ProtoReflect.Descriptor instead. | ||||
| func (*IsAuthorizedResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{2} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{4} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedResponse) GetAuthorized() bool { | ||||
| @@ -204,110 +322,17 @@ func (x *IsAuthorizedResponse) GetAuthorized() bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| type TokenWrapper struct { | ||||
| type GetAccessTokenRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` | ||||
| 	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` | ||||
| 	Token    string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *TokenWrapper) Reset() { | ||||
| 	*x = TokenWrapper{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[3] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *TokenWrapper) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*TokenWrapper) ProtoMessage() {} | ||||
|  | ||||
| func (x *TokenWrapper) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_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 TokenWrapper.ProtoReflect.Descriptor instead. | ||||
| func (*TokenWrapper) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{3} | ||||
| } | ||||
|  | ||||
| func (x *TokenWrapper) GetToken() string { | ||||
| 	if x != nil { | ||||
| 		return x.Token | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type IsValidTokenRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Token *TokenWrapper `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) Reset() { | ||||
| 	*x = IsValidTokenRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[4] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*IsValidTokenRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsValidTokenRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_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 IsValidTokenRequest.ProtoReflect.Descriptor instead. | ||||
| func (*IsValidTokenRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{4} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) GetToken() *TokenWrapper { | ||||
| 	if x != nil { | ||||
| 		return x.Token | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type IsValidTokenResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Domain string `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) Reset() { | ||||
| 	*x = IsValidTokenResponse{} | ||||
| func (x *GetAccessTokenRequest) Reset() { | ||||
| 	*x = GetAccessTokenRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[5] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| @@ -315,13 +340,13 @@ func (x *IsValidTokenResponse) Reset() { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) String() string { | ||||
| func (x *GetAccessTokenRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*IsValidTokenResponse) ProtoMessage() {} | ||||
| func (*GetAccessTokenRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsValidTokenResponse) ProtoReflect() protoreflect.Message { | ||||
| func (x *GetAccessTokenRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[5] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| @@ -333,61 +358,153 @@ func (x *IsValidTokenResponse) ProtoReflect() protoreflect.Message { | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use IsValidTokenResponse.ProtoReflect.Descriptor instead. | ||||
| func (*IsValidTokenResponse) Descriptor() ([]byte, []int) { | ||||
| // Deprecated: Use GetAccessTokenRequest.ProtoReflect.Descriptor instead. | ||||
| func (*GetAccessTokenRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{5} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) GetDomain() string { | ||||
| func (x *GetAccessTokenRequest) GetUsername() string { | ||||
| 	if x != nil { | ||||
| 		return x.Username | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetAccessTokenRequest) GetToken() string { | ||||
| 	if x != nil { | ||||
| 		return x.Token | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type GetAccessTokenResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Domain      string `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"` | ||||
| 	AccessToken string `protobuf:"bytes,2,opt,name=accessToken,proto3" json:"accessToken,omitempty"` | ||||
| 	Username    string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *GetAccessTokenResponse) Reset() { | ||||
| 	*x = GetAccessTokenResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[6] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *GetAccessTokenResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*GetAccessTokenResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetAccessTokenResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_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 GetAccessTokenResponse.ProtoReflect.Descriptor instead. | ||||
| func (*GetAccessTokenResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{6} | ||||
| } | ||||
|  | ||||
| func (x *GetAccessTokenResponse) GetDomain() string { | ||||
| 	if x != nil { | ||||
| 		return x.Domain | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetAccessTokenResponse) GetAccessToken() string { | ||||
| 	if x != nil { | ||||
| 		return x.AccessToken | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetAccessTokenResponse) GetUsername() string { | ||||
| 	if x != nil { | ||||
| 		return x.Username | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| var File_auth_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_auth_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, | ||||
| 	0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, | ||||
| 	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, | ||||
| 	0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | ||||
| 	0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x96, 0x01, 0x0a, | ||||
| 	0x0c, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1c, 0x0a, | ||||
| 	0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, | ||||
| 	0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, | ||||
| 	0x65, 0x72, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x12, | ||||
| 	0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, | ||||
| 	0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, | ||||
| 	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x13, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, | ||||
| 	0x72, 0x69, 0x7a, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0c, | ||||
| 	0x69, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, | ||||
| 	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, | ||||
| 	0x72, 0x69, 0x7a, 0x65, 0x64, 0x52, 0x0c, 0x69, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, | ||||
| 	0x7a, 0x65, 0x64, 0x22, 0x36, 0x0a, 0x14, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, | ||||
| 	0x7a, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x61, | ||||
| 	0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, | ||||
| 	0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x24, 0x0a, 0x0c, 0x54, | ||||
| 	0x6f, 0x6b, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, | ||||
| 	0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x22, 0x3e, 0x0a, 0x13, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, | ||||
| 	0x6b, 0x65, 0x6e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x22, 0x2e, 0x0a, 0x14, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, | ||||
| 	0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, | ||||
| 	0x6e, 0x32, 0xea, 0x01, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||
| 	0x65, 0x12, 0x6c, 0x0a, 0x0c, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, | ||||
| 	0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, | ||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x18, | ||||
| 	0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x61, 0x75, | ||||
| 	0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, | ||||
| 	0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, | ||||
| 	0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, | ||||
| 	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x47, 0x0a, | ||||
| 	0x13, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, | ||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, | ||||
| 	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||
| 	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x60, 0x0a, 0x14, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, | ||||
| 	0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, | ||||
| 	0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, | ||||
| 	0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, | ||||
| 	0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, | ||||
| 	0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x0c, 0x49, 0x73, 0x41, | ||||
| 	0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, | ||||
| 	0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x12, 0x14, 0x0a, 0x05, 0x67, | ||||
| 	0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, | ||||
| 	0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x22, 0x0a, | ||||
| 	0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, | ||||
| 	0x65, 0x22, 0x4c, 0x0a, 0x13, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, | ||||
| 	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0c, 0x69, 0x73, 0x41, 0x75, | ||||
| 	0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, | ||||
| 	0x64, 0x52, 0x0c, 0x69, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, | ||||
| 	0x36, 0x0a, 0x14, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, | ||||
| 	0x72, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x74, | ||||
| 	0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x49, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x63, | ||||
| 	0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, | ||||
| 	0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, | ||||
| 	0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, | ||||
| 	0x65, 0x6e, 0x22, 0x6e, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, | ||||
| 	0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, | ||||
| 	0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, | ||||
| 	0x6d, 0x61, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, | ||||
| 	0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, | ||||
| 	0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x32, 0xe9, 0x02, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, | ||||
| 	0x63, 0x65, 0x12, 0x6b, 0x0a, 0x0c, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, | ||||
| 	0x65, 0x6e, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, | ||||
| 	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, | ||||
| 	0x02, 0x1d, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, | ||||
| 	0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x01, 0x2a, 0x12, | ||||
| 	0x7e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, | ||||
| 	0x6e, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, | ||||
| 	0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, | ||||
| 	0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, | ||||
| 	0x02, 0x28, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, | ||||
| 	0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, | ||||
| 	0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, | ||||
| 	0x6d, 0x0a, 0x0c, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x12, | ||||
| 	0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, | ||||
| 	0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| @@ -410,27 +527,29 @@ func file_auth_proto_rawDescGZIP() []byte { | ||||
| 	return file_auth_proto_rawDescData | ||||
| } | ||||
|  | ||||
| var file_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 6) | ||||
| var file_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 7) | ||||
| var file_auth_proto_goTypes = []interface{}{ | ||||
| 	(*IsAuthorized)(nil),         // 0: api.IsAuthorized | ||||
| 	(*IsAuthorizedRequest)(nil),  // 1: api.IsAuthorizedRequest | ||||
| 	(*IsAuthorizedResponse)(nil), // 2: api.IsAuthorizedResponse | ||||
| 	(*TokenWrapper)(nil),         // 3: api.TokenWrapper | ||||
| 	(*IsValidTokenRequest)(nil),  // 4: api.IsValidTokenRequest | ||||
| 	(*IsValidTokenResponse)(nil), // 5: api.IsValidTokenResponse | ||||
| 	(*IsValidTokenRequest)(nil),    // 0: api.IsValidTokenRequest | ||||
| 	(*IsValidTokenResponse)(nil),   // 1: api.IsValidTokenResponse | ||||
| 	(*IsAuthorized)(nil),           // 2: api.IsAuthorized | ||||
| 	(*IsAuthorizedRequest)(nil),    // 3: api.IsAuthorizedRequest | ||||
| 	(*IsAuthorizedResponse)(nil),   // 4: api.IsAuthorizedResponse | ||||
| 	(*GetAccessTokenRequest)(nil),  // 5: api.GetAccessTokenRequest | ||||
| 	(*GetAccessTokenResponse)(nil), // 6: api.GetAccessTokenResponse | ||||
| } | ||||
| var file_auth_proto_depIdxs = []int32{ | ||||
| 	0, // 0: api.IsAuthorizedRequest.isAuthorized:type_name -> api.IsAuthorized | ||||
| 	3, // 1: api.IsValidTokenRequest.token:type_name -> api.TokenWrapper | ||||
| 	4, // 2: api.AuthService.IsValidToken:input_type -> api.IsValidTokenRequest | ||||
| 	1, // 3: api.AuthService.IsAuthorized:input_type -> api.IsAuthorizedRequest | ||||
| 	5, // 4: api.AuthService.IsValidToken:output_type -> api.IsValidTokenResponse | ||||
| 	2, // 5: api.AuthService.IsAuthorized:output_type -> api.IsAuthorizedResponse | ||||
| 	4, // [4:6] is the sub-list for method output_type | ||||
| 	2, // [2:4] 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 | ||||
| 	2, // 0: api.IsAuthorizedRequest.isAuthorized:type_name -> api.IsAuthorized | ||||
| 	0, // 1: api.AuthService.IsValidToken:input_type -> api.IsValidTokenRequest | ||||
| 	5, // 2: api.AuthService.GetAccessToken:input_type -> api.GetAccessTokenRequest | ||||
| 	3, // 3: api.AuthService.IsAuthorized:input_type -> api.IsAuthorizedRequest | ||||
| 	1, // 4: api.AuthService.IsValidToken:output_type -> api.IsValidTokenResponse | ||||
| 	6, // 5: api.AuthService.GetAccessToken:output_type -> api.GetAccessTokenResponse | ||||
| 	4, // 6: api.AuthService.IsAuthorized:output_type -> api.IsAuthorizedResponse | ||||
| 	4, // [4:7] is the sub-list for method output_type | ||||
| 	1, // [1:4] is the sub-list for method input_type | ||||
| 	1, // [1:1] is the sub-list for extension type_name | ||||
| 	1, // [1:1] is the sub-list for extension extendee | ||||
| 	0, // [0:1] is the sub-list for field type_name | ||||
| } | ||||
|  | ||||
| func init() { file_auth_proto_init() } | ||||
| @@ -440,54 +559,6 @@ func file_auth_proto_init() { | ||||
| 	} | ||||
| 	if !protoimpl.UnsafeEnabled { | ||||
| 		file_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorized); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorizedRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorizedResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*TokenWrapper); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsValidTokenRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| @@ -499,7 +570,7 @@ func file_auth_proto_init() { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { | ||||
| 		file_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsValidTokenResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| @@ -511,6 +582,66 @@ func file_auth_proto_init() { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorized); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorizedRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorizedResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetAccessTokenRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetAccessTokenResponse); 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{ | ||||
| @@ -518,7 +649,7 @@ func file_auth_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_auth_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   6, | ||||
| 			NumMessages:   7, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   1, | ||||
| 		}, | ||||
| @@ -544,7 +675,9 @@ const _ = grpc.SupportPackageIsVersion6 | ||||
| // | ||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. | ||||
| type AuthServiceClient interface { | ||||
| 	// Deprecated: Do not use. | ||||
| 	IsValidToken(ctx context.Context, in *IsValidTokenRequest, opts ...grpc.CallOption) (*IsValidTokenResponse, error) | ||||
| 	GetAccessToken(ctx context.Context, in *GetAccessTokenRequest, opts ...grpc.CallOption) (*GetAccessTokenResponse, error) | ||||
| 	IsAuthorized(ctx context.Context, in *IsAuthorizedRequest, opts ...grpc.CallOption) (*IsAuthorizedResponse, error) | ||||
| } | ||||
|  | ||||
| @@ -556,6 +689,7 @@ func NewAuthServiceClient(cc grpc.ClientConnInterface) AuthServiceClient { | ||||
| 	return &authServiceClient{cc} | ||||
| } | ||||
|  | ||||
| // Deprecated: Do not use. | ||||
| func (c *authServiceClient) IsValidToken(ctx context.Context, in *IsValidTokenRequest, opts ...grpc.CallOption) (*IsValidTokenResponse, error) { | ||||
| 	out := new(IsValidTokenResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.AuthService/IsValidToken", in, out, opts...) | ||||
| @@ -565,6 +699,15 @@ func (c *authServiceClient) IsValidToken(ctx context.Context, in *IsValidTokenRe | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *authServiceClient) GetAccessToken(ctx context.Context, in *GetAccessTokenRequest, opts ...grpc.CallOption) (*GetAccessTokenResponse, error) { | ||||
| 	out := new(GetAccessTokenResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.AuthService/GetAccessToken", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *authServiceClient) IsAuthorized(ctx context.Context, in *IsAuthorizedRequest, opts ...grpc.CallOption) (*IsAuthorizedResponse, error) { | ||||
| 	out := new(IsAuthorizedResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.AuthService/IsAuthorized", in, out, opts...) | ||||
| @@ -576,7 +719,9 @@ func (c *authServiceClient) IsAuthorized(ctx context.Context, in *IsAuthorizedRe | ||||
|  | ||||
| // AuthServiceServer is the server API for AuthService service. | ||||
| type AuthServiceServer interface { | ||||
| 	// Deprecated: Do not use. | ||||
| 	IsValidToken(context.Context, *IsValidTokenRequest) (*IsValidTokenResponse, error) | ||||
| 	GetAccessToken(context.Context, *GetAccessTokenRequest) (*GetAccessTokenResponse, error) | ||||
| 	IsAuthorized(context.Context, *IsAuthorizedRequest) (*IsAuthorizedResponse, error) | ||||
| } | ||||
|  | ||||
| @@ -587,6 +732,9 @@ type UnimplementedAuthServiceServer struct { | ||||
| func (*UnimplementedAuthServiceServer) IsValidToken(context.Context, *IsValidTokenRequest) (*IsValidTokenResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method IsValidToken not implemented") | ||||
| } | ||||
| func (*UnimplementedAuthServiceServer) GetAccessToken(context.Context, *GetAccessTokenRequest) (*GetAccessTokenResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetAccessToken not implemented") | ||||
| } | ||||
| func (*UnimplementedAuthServiceServer) IsAuthorized(context.Context, *IsAuthorizedRequest) (*IsAuthorizedResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method IsAuthorized not implemented") | ||||
| } | ||||
| @@ -613,6 +761,24 @@ func _AuthService_IsValidToken_Handler(srv interface{}, ctx context.Context, dec | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _AuthService_GetAccessToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetAccessTokenRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(AuthServiceServer).GetAccessToken(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.AuthService/GetAccessToken", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(AuthServiceServer).GetAccessToken(ctx, req.(*GetAccessTokenRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _AuthService_IsAuthorized_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(IsAuthorizedRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| @@ -639,6 +805,10 @@ var _AuthService_serviceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "IsValidToken", | ||||
| 			Handler:    _AuthService_IsValidToken_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetAccessToken", | ||||
| 			Handler:    _AuthService_GetAccessToken_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "IsAuthorized", | ||||
| 			Handler:    _AuthService_IsAuthorized_Handler, | ||||
|   | ||||
| @@ -39,7 +39,7 @@ func request_AuthService_IsValidToken_0(ctx context.Context, marshaler runtime.M | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Token); err != nil && err != io.EOF { | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| @@ -56,7 +56,7 @@ func local_request_AuthService_IsValidToken_0(ctx context.Context, marshaler run | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Token); err != nil && err != io.EOF { | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| @@ -65,6 +65,40 @@ func local_request_AuthService_IsValidToken_0(ctx context.Context, marshaler run | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_AuthService_GetAccessToken_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetAccessTokenRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.GetAccessToken(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_AuthService_GetAccessToken_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetAccessTokenRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.GetAccessToken(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_AuthService_IsAuthorized_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq IsAuthorizedRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| @@ -124,6 +158,26 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_AuthService_GetAccessToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_AuthService_GetAccessToken_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_AuthService_GetAccessToken_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_AuthService_IsAuthorized_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -205,6 +259,26 @@ func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_AuthService_GetAccessToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_AuthService_GetAccessToken_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_AuthService_GetAccessToken_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_AuthService_IsAuthorized_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -231,11 +305,15 @@ func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux | ||||
| var ( | ||||
| 	pattern_AuthService_IsValidToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"apis", "v1beta1", "auth", "token"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_AuthService_GetAccessToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"apis", "v1beta1", "auth", "get_access_token"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_AuthService_IsAuthorized_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"apis", "v1beta1", "auth"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	forward_AuthService_IsValidToken_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_AuthService_GetAccessToken_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_AuthService_IsAuthorized_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
|   | ||||
| @@ -3,13 +3,25 @@ syntax = "proto3"; | ||||
| package api; | ||||
|  | ||||
| import "google/api/annotations.proto"; | ||||
| import "google/protobuf/empty.proto"; | ||||
| import "protoc-gen-swagger/options/annotations.proto"; | ||||
|  | ||||
| service AuthService { | ||||
|     rpc IsValidToken(IsValidTokenRequest) returns (IsValidTokenResponse) { | ||||
|         option (google.api.http) = { | ||||
|             post: "/apis/v1beta1/auth/token" | ||||
|             body: "token" | ||||
|             body: "*" | ||||
|         }; | ||||
|         option deprecated = true; | ||||
|     } | ||||
|  | ||||
|     rpc GetAccessToken(GetAccessTokenRequest) returns (GetAccessTokenResponse) { | ||||
|         option (google.api.http) = { | ||||
|             post: "/apis/v1beta1/auth/get_access_token" | ||||
|             body: "*" | ||||
|         }; | ||||
|         option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { | ||||
| 			security: { | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
|  | ||||
| @@ -21,6 +33,17 @@ service AuthService { | ||||
|     } | ||||
| } | ||||
|  | ||||
| message IsValidTokenRequest { | ||||
|     string username = 1; | ||||
|     string token = 2; | ||||
| } | ||||
|  | ||||
| message IsValidTokenResponse { | ||||
|     string domain = 1; | ||||
|     string token = 2; | ||||
|     string username = 3; | ||||
| } | ||||
|  | ||||
| message IsAuthorized { | ||||
|     string namespace = 1; | ||||
|     string verb = 2; | ||||
| @@ -37,14 +60,13 @@ message IsAuthorizedResponse { | ||||
|     bool authorized = 1; | ||||
| } | ||||
|  | ||||
| message TokenWrapper { | ||||
|     string token = 1; | ||||
| message GetAccessTokenRequest { | ||||
|     string username = 1; | ||||
|     string token = 2; | ||||
| } | ||||
|  | ||||
| message IsValidTokenRequest { | ||||
|     TokenWrapper token = 1; | ||||
| } | ||||
|  | ||||
| message IsValidTokenResponse { | ||||
| message GetAccessTokenResponse { | ||||
|     string domain = 1; | ||||
|     string accessToken = 2; | ||||
|     string username = 3; | ||||
| } | ||||
							
								
								
									
										274
									
								
								api/label.pb.go
									
									
									
									
									
								
							
							
						
						
									
										274
									
								
								api/label.pb.go
									
									
									
									
									
								
							| @@ -337,6 +337,77 @@ func (x *GetLabelsRequest) GetUid() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type GetAvailableLabelsRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	Resource  string `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` | ||||
| 	KeyLike   string `protobuf:"bytes,3,opt,name=keyLike,proto3" json:"keyLike,omitempty"` | ||||
| 	SkipKeys  string `protobuf:"bytes,4,opt,name=skipKeys,proto3" json:"skipKeys,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) Reset() { | ||||
| 	*x = GetAvailableLabelsRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_label_proto_msgTypes[5] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*GetAvailableLabelsRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_label_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 GetAvailableLabelsRequest.ProtoReflect.Descriptor instead. | ||||
| func (*GetAvailableLabelsRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_label_proto_rawDescGZIP(), []int{5} | ||||
| } | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) GetResource() string { | ||||
| 	if x != nil { | ||||
| 		return x.Resource | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) GetKeyLike() string { | ||||
| 	if x != nil { | ||||
| 		return x.KeyLike | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetAvailableLabelsRequest) GetSkipKeys() string { | ||||
| 	if x != nil { | ||||
| 		return x.SkipKeys | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type GetLabelsResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -348,7 +419,7 @@ type GetLabelsResponse struct { | ||||
| func (x *GetLabelsResponse) Reset() { | ||||
| 	*x = GetLabelsResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_label_proto_msgTypes[5] | ||||
| 		mi := &file_label_proto_msgTypes[6] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -361,7 +432,7 @@ func (x *GetLabelsResponse) String() string { | ||||
| func (*GetLabelsResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetLabelsResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_label_proto_msgTypes[5] | ||||
| 	mi := &file_label_proto_msgTypes[6] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -374,7 +445,7 @@ func (x *GetLabelsResponse) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use GetLabelsResponse.ProtoReflect.Descriptor instead. | ||||
| func (*GetLabelsResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_label_proto_rawDescGZIP(), []int{5} | ||||
| 	return file_label_proto_rawDescGZIP(), []int{6} | ||||
| } | ||||
|  | ||||
| func (x *GetLabelsResponse) GetLabels() []*KeyValue { | ||||
| @@ -398,7 +469,7 @@ type DeleteLabelRequest struct { | ||||
| func (x *DeleteLabelRequest) Reset() { | ||||
| 	*x = DeleteLabelRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_label_proto_msgTypes[6] | ||||
| 		mi := &file_label_proto_msgTypes[7] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -411,7 +482,7 @@ func (x *DeleteLabelRequest) String() string { | ||||
| func (*DeleteLabelRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *DeleteLabelRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_label_proto_msgTypes[6] | ||||
| 	mi := &file_label_proto_msgTypes[7] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -424,7 +495,7 @@ func (x *DeleteLabelRequest) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use DeleteLabelRequest.ProtoReflect.Descriptor instead. | ||||
| func (*DeleteLabelRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_label_proto_rawDescGZIP(), []int{6} | ||||
| 	return file_label_proto_rawDescGZIP(), []int{7} | ||||
| } | ||||
|  | ||||
| func (x *DeleteLabelRequest) GetNamespace() string { | ||||
| @@ -490,51 +561,69 @@ var file_label_proto_rawDesc = []byte{ | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, | ||||
| 	0x75, 0x69, 0x64, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, | ||||
| 	0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, | ||||
| 	0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, | ||||
| 	0x72, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, | ||||
| 	0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, | ||||
| 	0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, | ||||
| 	0x6b, 0x65, 0x79, 0x32, 0x8d, 0x04, 0x0a, 0x0c, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x72, | ||||
| 	0x76, 0x69, 0x63, 0x65, 0x12, 0x75, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, | ||||
| 	0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, | ||||
| 	0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, | ||||
| 	0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, | ||||
| 	0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, | ||||
| 	0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6b, | ||||
| 	0x65, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, | ||||
| 	0x79, 0x4c, 0x69, 0x6b, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6b, 0x69, 0x70, 0x4b, 0x65, 0x79, | ||||
| 	0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6b, 0x69, 0x70, 0x4b, 0x65, 0x79, | ||||
| 	0x73, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, | ||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, | ||||
| 	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x65, 0x79, | ||||
| 	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x72, 0x0a, | ||||
| 	0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x10, 0x0a, | ||||
| 	0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, | ||||
| 	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, | ||||
| 	0x79, 0x32, 0x98, 0x05, 0x0a, 0x0c, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, | ||||
| 	0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, | ||||
| 	0x62, 0x6c, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x62, 0x65, | ||||
| 	0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, | ||||
| 	0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x73, | ||||
| 	0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, | ||||
| 	0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x73, | ||||
| 	0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x75, 0x0a, | ||||
| 	0x09, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, | ||||
| 	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x33, 0x12, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, | ||||
| 	0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, | ||||
| 	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, | ||||
| 	0x62, 0x65, 0x6c, 0x73, 0x12, 0x7d, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, | ||||
| 	0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x64, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, | ||||
| 	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, | ||||
| 	0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, | ||||
| 	0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, | ||||
| 	0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x22, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, | ||||
| 	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x7b, | ||||
| 	0x75, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x7d, 0x0a, 0x09, 0x41, | ||||
| 	0x64, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, | ||||
| 	0x64, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||
| 	0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x22, | ||||
| 	0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, | ||||
| 	0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, | ||||
| 	0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, | ||||
| 	0x6c, 0x73, 0x3a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x52, | ||||
| 	0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, | ||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, | ||||
| 	0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, | ||||
| 	0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x1a, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, | ||||
| 	0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x75, | ||||
| 	0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x3a, 0x06, 0x6c, 0x61, 0x62, 0x65, | ||||
| 	0x6c, 0x73, 0x12, 0x7f, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, | ||||
| 	0x6c, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x61, | ||||
| 	0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x2a, 0x37, 0x2f, 0x61, 0x70, 0x69, | ||||
| 	0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, | ||||
| 	0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6b, | ||||
| 	0x65, 0x79, 0x7d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x75, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x3a, 0x06, 0x6c, 0x61, 0x62, | ||||
| 	0x65, 0x6c, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4c, | ||||
| 	0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x70, 0x6c, | ||||
| 	0x61, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, | ||||
| 	0x1a, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, | ||||
| 	0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x73, | ||||
| 	0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x61, 0x62, | ||||
| 	0x65, 0x6c, 0x73, 0x3a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x7f, 0x0a, 0x0b, 0x44, | ||||
| 	0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, | ||||
| 	0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, | ||||
| 	0x93, 0x02, 0x39, 0x2a, 0x37, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, | ||||
| 	0x61, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x2f, 0x7b, | ||||
| 	0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x7d, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, | ||||
| 	0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x62, 0x06, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
| @@ -549,31 +638,34 @@ func file_label_proto_rawDescGZIP() []byte { | ||||
| 	return file_label_proto_rawDescData | ||||
| } | ||||
|  | ||||
| var file_label_proto_msgTypes = make([]protoimpl.MessageInfo, 7) | ||||
| var file_label_proto_msgTypes = make([]protoimpl.MessageInfo, 8) | ||||
| var file_label_proto_goTypes = []interface{}{ | ||||
| 	(*KeyValue)(nil),             // 0: api.KeyValue | ||||
| 	(*Labels)(nil),               // 1: api.Labels | ||||
| 	(*AddLabelsRequest)(nil),     // 2: api.AddLabelsRequest | ||||
| 	(*ReplaceLabelsRequest)(nil), // 3: api.ReplaceLabelsRequest | ||||
| 	(*GetLabelsRequest)(nil),     // 4: api.GetLabelsRequest | ||||
| 	(*GetLabelsResponse)(nil),    // 5: api.GetLabelsResponse | ||||
| 	(*DeleteLabelRequest)(nil),   // 6: api.DeleteLabelRequest | ||||
| 	(*KeyValue)(nil),                  // 0: api.KeyValue | ||||
| 	(*Labels)(nil),                    // 1: api.Labels | ||||
| 	(*AddLabelsRequest)(nil),          // 2: api.AddLabelsRequest | ||||
| 	(*ReplaceLabelsRequest)(nil),      // 3: api.ReplaceLabelsRequest | ||||
| 	(*GetLabelsRequest)(nil),          // 4: api.GetLabelsRequest | ||||
| 	(*GetAvailableLabelsRequest)(nil), // 5: api.GetAvailableLabelsRequest | ||||
| 	(*GetLabelsResponse)(nil),         // 6: api.GetLabelsResponse | ||||
| 	(*DeleteLabelRequest)(nil),        // 7: api.DeleteLabelRequest | ||||
| } | ||||
| var file_label_proto_depIdxs = []int32{ | ||||
| 	0, // 0: api.Labels.items:type_name -> api.KeyValue | ||||
| 	1, // 1: api.AddLabelsRequest.labels:type_name -> api.Labels | ||||
| 	1, // 2: api.ReplaceLabelsRequest.labels:type_name -> api.Labels | ||||
| 	0, // 3: api.GetLabelsResponse.labels:type_name -> api.KeyValue | ||||
| 	4, // 4: api.LabelService.GetLabels:input_type -> api.GetLabelsRequest | ||||
| 	2, // 5: api.LabelService.AddLabels:input_type -> api.AddLabelsRequest | ||||
| 	3, // 6: api.LabelService.ReplaceLabels:input_type -> api.ReplaceLabelsRequest | ||||
| 	6, // 7: api.LabelService.DeleteLabel:input_type -> api.DeleteLabelRequest | ||||
| 	5, // 8: api.LabelService.GetLabels:output_type -> api.GetLabelsResponse | ||||
| 	5, // 9: api.LabelService.AddLabels:output_type -> api.GetLabelsResponse | ||||
| 	5, // 10: api.LabelService.ReplaceLabels:output_type -> api.GetLabelsResponse | ||||
| 	5, // 11: api.LabelService.DeleteLabel:output_type -> api.GetLabelsResponse | ||||
| 	8, // [8:12] is the sub-list for method output_type | ||||
| 	4, // [4:8] is the sub-list for method input_type | ||||
| 	5, // 4: api.LabelService.GetAvailableLabels:input_type -> api.GetAvailableLabelsRequest | ||||
| 	4, // 5: api.LabelService.GetLabels:input_type -> api.GetLabelsRequest | ||||
| 	2, // 6: api.LabelService.AddLabels:input_type -> api.AddLabelsRequest | ||||
| 	3, // 7: api.LabelService.ReplaceLabels:input_type -> api.ReplaceLabelsRequest | ||||
| 	7, // 8: api.LabelService.DeleteLabel:input_type -> api.DeleteLabelRequest | ||||
| 	6, // 9: api.LabelService.GetAvailableLabels:output_type -> api.GetLabelsResponse | ||||
| 	6, // 10: api.LabelService.GetLabels:output_type -> api.GetLabelsResponse | ||||
| 	6, // 11: api.LabelService.AddLabels:output_type -> api.GetLabelsResponse | ||||
| 	6, // 12: api.LabelService.ReplaceLabels:output_type -> api.GetLabelsResponse | ||||
| 	6, // 13: api.LabelService.DeleteLabel:output_type -> api.GetLabelsResponse | ||||
| 	9, // [9:14] is the sub-list for method output_type | ||||
| 	4, // [4:9] is the sub-list for method input_type | ||||
| 	4, // [4:4] is the sub-list for extension type_name | ||||
| 	4, // [4:4] is the sub-list for extension extendee | ||||
| 	0, // [0:4] is the sub-list for field type_name | ||||
| @@ -646,7 +738,7 @@ func file_label_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_label_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetLabelsResponse); i { | ||||
| 			switch v := v.(*GetAvailableLabelsRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -658,6 +750,18 @@ func file_label_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_label_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetLabelsResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_label_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*DeleteLabelRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| @@ -676,7 +780,7 @@ func file_label_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_label_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   7, | ||||
| 			NumMessages:   8, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   1, | ||||
| 		}, | ||||
| @@ -702,6 +806,7 @@ const _ = grpc.SupportPackageIsVersion6 | ||||
| // | ||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. | ||||
| type LabelServiceClient interface { | ||||
| 	GetAvailableLabels(ctx context.Context, in *GetAvailableLabelsRequest, opts ...grpc.CallOption) (*GetLabelsResponse, error) | ||||
| 	GetLabels(ctx context.Context, in *GetLabelsRequest, opts ...grpc.CallOption) (*GetLabelsResponse, error) | ||||
| 	AddLabels(ctx context.Context, in *AddLabelsRequest, opts ...grpc.CallOption) (*GetLabelsResponse, error) | ||||
| 	ReplaceLabels(ctx context.Context, in *ReplaceLabelsRequest, opts ...grpc.CallOption) (*GetLabelsResponse, error) | ||||
| @@ -716,6 +821,15 @@ func NewLabelServiceClient(cc grpc.ClientConnInterface) LabelServiceClient { | ||||
| 	return &labelServiceClient{cc} | ||||
| } | ||||
|  | ||||
| func (c *labelServiceClient) GetAvailableLabels(ctx context.Context, in *GetAvailableLabelsRequest, opts ...grpc.CallOption) (*GetLabelsResponse, error) { | ||||
| 	out := new(GetLabelsResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.LabelService/GetAvailableLabels", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *labelServiceClient) GetLabels(ctx context.Context, in *GetLabelsRequest, opts ...grpc.CallOption) (*GetLabelsResponse, error) { | ||||
| 	out := new(GetLabelsResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.LabelService/GetLabels", in, out, opts...) | ||||
| @@ -754,6 +868,7 @@ func (c *labelServiceClient) DeleteLabel(ctx context.Context, in *DeleteLabelReq | ||||
|  | ||||
| // LabelServiceServer is the server API for LabelService service. | ||||
| type LabelServiceServer interface { | ||||
| 	GetAvailableLabels(context.Context, *GetAvailableLabelsRequest) (*GetLabelsResponse, error) | ||||
| 	GetLabels(context.Context, *GetLabelsRequest) (*GetLabelsResponse, error) | ||||
| 	AddLabels(context.Context, *AddLabelsRequest) (*GetLabelsResponse, error) | ||||
| 	ReplaceLabels(context.Context, *ReplaceLabelsRequest) (*GetLabelsResponse, error) | ||||
| @@ -764,6 +879,9 @@ type LabelServiceServer interface { | ||||
| type UnimplementedLabelServiceServer struct { | ||||
| } | ||||
|  | ||||
| func (*UnimplementedLabelServiceServer) GetAvailableLabels(context.Context, *GetAvailableLabelsRequest) (*GetLabelsResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetAvailableLabels not implemented") | ||||
| } | ||||
| func (*UnimplementedLabelServiceServer) GetLabels(context.Context, *GetLabelsRequest) (*GetLabelsResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetLabels not implemented") | ||||
| } | ||||
| @@ -781,6 +899,24 @@ func RegisterLabelServiceServer(s *grpc.Server, srv LabelServiceServer) { | ||||
| 	s.RegisterService(&_LabelService_serviceDesc, srv) | ||||
| } | ||||
|  | ||||
| func _LabelService_GetAvailableLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetAvailableLabelsRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(LabelServiceServer).GetAvailableLabels(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.LabelService/GetAvailableLabels", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(LabelServiceServer).GetAvailableLabels(ctx, req.(*GetAvailableLabelsRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _LabelService_GetLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetLabelsRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| @@ -857,6 +993,10 @@ var _LabelService_serviceDesc = grpc.ServiceDesc{ | ||||
| 	ServiceName: "api.LabelService", | ||||
| 	HandlerType: (*LabelServiceServer)(nil), | ||||
| 	Methods: []grpc.MethodDesc{ | ||||
| 		{ | ||||
| 			MethodName: "GetAvailableLabels", | ||||
| 			Handler:    _LabelService_GetAvailableLabels_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetLabels", | ||||
| 			Handler:    _LabelService_GetLabels_Handler, | ||||
|   | ||||
| @@ -31,6 +31,97 @@ var _ = runtime.String | ||||
| var _ = utilities.NewDoubleArray | ||||
| var _ = descriptor.ForMessage | ||||
|  | ||||
| var ( | ||||
| 	filter_LabelService_GetAvailableLabels_0 = &utilities.DoubleArray{Encoding: map[string]int{"namespace": 0, "resource": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} | ||||
| ) | ||||
|  | ||||
| func request_LabelService_GetAvailableLabels_0(ctx context.Context, marshaler runtime.Marshaler, client LabelServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetAvailableLabelsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
|  | ||||
| 	val, ok = pathParams["namespace"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Namespace, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["resource"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "resource") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Resource, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "resource", err) | ||||
| 	} | ||||
|  | ||||
| 	if err := req.ParseForm(); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_LabelService_GetAvailableLabels_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.GetAvailableLabels(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_LabelService_GetAvailableLabels_0(ctx context.Context, marshaler runtime.Marshaler, server LabelServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetAvailableLabelsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
|  | ||||
| 	val, ok = pathParams["namespace"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Namespace, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["resource"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "resource") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Resource, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "resource", err) | ||||
| 	} | ||||
|  | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_LabelService_GetAvailableLabels_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.GetAvailableLabels(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_LabelService_GetLabels_0(ctx context.Context, marshaler runtime.Marshaler, client LabelServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetLabelsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| @@ -482,6 +573,26 @@ func local_request_LabelService_DeleteLabel_0(ctx context.Context, marshaler run | ||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. | ||||
| func RegisterLabelServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server LabelServiceServer) error { | ||||
|  | ||||
| 	mux.Handle("GET", pattern_LabelService_GetAvailableLabels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_LabelService_GetAvailableLabels_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_LabelService_GetAvailableLabels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_LabelService_GetLabels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -603,6 +714,26 @@ func RegisterLabelServiceHandler(ctx context.Context, mux *runtime.ServeMux, con | ||||
| // "LabelServiceClient" to call the correct interceptors. | ||||
| func RegisterLabelServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client LabelServiceClient) error { | ||||
|  | ||||
| 	mux.Handle("GET", pattern_LabelService_GetAvailableLabels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_LabelService_GetAvailableLabels_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_LabelService_GetAvailableLabels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_LabelService_GetLabels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -687,6 +818,8 @@ func RegisterLabelServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	pattern_LabelService_GetAvailableLabels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 2, 2}, []string{"apis", "v1beta1", "labels", "namespace", "resource"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_LabelService_GetLabels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "resource", "uid", "labels"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_LabelService_AddLabels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "resource", "uid", "labels"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| @@ -697,6 +830,8 @@ var ( | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	forward_LabelService_GetAvailableLabels_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_LabelService_GetLabels_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_LabelService_AddLabels_0 = runtime.ForwardResponseMessage | ||||
|   | ||||
| @@ -5,6 +5,12 @@ package api; | ||||
| import "google/api/annotations.proto"; | ||||
|  | ||||
| service LabelService { | ||||
|     rpc GetAvailableLabels (GetAvailableLabelsRequest) returns (GetLabelsResponse) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/labels/{namespace}/{resource}/labels" | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc GetLabels (GetLabelsRequest) returns (GetLabelsResponse) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/{resource}/{uid}/labels" | ||||
| @@ -61,6 +67,13 @@ message GetLabelsRequest { | ||||
|     string uid = 3; | ||||
| } | ||||
|  | ||||
| message GetAvailableLabelsRequest { | ||||
|     string namespace = 1; | ||||
|     string resource = 2; | ||||
|     string keyLike = 3; | ||||
|     string skipKeys = 4; | ||||
| } | ||||
|  | ||||
| message GetLabelsResponse { | ||||
|     repeated KeyValue labels = 1; | ||||
| } | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1212,6 +1212,190 @@ func local_request_WorkflowService_UpdateWorkflowExecutionStatus_0(ctx context.C | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkflowService_AddWorkflowExecutionMetrics_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq AddWorkflowExecutionsMetricsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
|  | ||||
| 	val, ok = pathParams["namespace"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Namespace, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["uid"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uid") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Uid, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uid", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.AddWorkflowExecutionMetrics(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_WorkflowService_AddWorkflowExecutionMetrics_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq AddWorkflowExecutionsMetricsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
|  | ||||
| 	val, ok = pathParams["namespace"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Namespace, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["uid"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uid") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Uid, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uid", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.AddWorkflowExecutionMetrics(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkflowService_UpdateWorkflowExecutionMetrics_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq UpdateWorkflowExecutionsMetricsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
|  | ||||
| 	val, ok = pathParams["namespace"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Namespace, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["uid"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uid") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Uid, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uid", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.UpdateWorkflowExecutionMetrics(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_WorkflowService_UpdateWorkflowExecutionMetrics_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq UpdateWorkflowExecutionsMetricsRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		val string | ||||
| 		ok  bool | ||||
| 		err error | ||||
| 		_   = err | ||||
| 	) | ||||
|  | ||||
| 	val, ok = pathParams["namespace"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Namespace, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["uid"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "uid") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Uid, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "uid", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.UpdateWorkflowExecutionMetrics(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| // RegisterWorkflowServiceHandlerServer registers the http handlers for service WorkflowService to "mux". | ||||
| // UnaryRPC     :call WorkflowServiceServer directly. | ||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. | ||||
| @@ -1491,6 +1675,46 @@ func RegisterWorkflowServiceHandlerServer(ctx context.Context, mux *runtime.Serv | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_WorkflowService_AddWorkflowExecutionMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_WorkflowService_AddWorkflowExecutionMetrics_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkflowService_AddWorkflowExecutionMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("PUT", pattern_WorkflowService_UpdateWorkflowExecutionMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_WorkflowService_UpdateWorkflowExecutionMetrics_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkflowService_UpdateWorkflowExecutionMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -1832,6 +2056,46 @@ func RegisterWorkflowServiceHandlerClient(ctx context.Context, mux *runtime.Serv | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_WorkflowService_AddWorkflowExecutionMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_WorkflowService_AddWorkflowExecutionMetrics_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkflowService_AddWorkflowExecutionMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("PUT", pattern_WorkflowService_UpdateWorkflowExecutionMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		rctx, err := runtime.AnnotateContext(ctx, mux, req) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_WorkflowService_UpdateWorkflowExecutionMetrics_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkflowService_UpdateWorkflowExecutionMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -1865,6 +2129,10 @@ var ( | ||||
| 	pattern_WorkflowService_CronStartWorkflowExecutionStatistic_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "uid", "cron_start_statistics"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowService_UpdateWorkflowExecutionStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "uid", "status"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowService_AddWorkflowExecutionMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "uid", "metric"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowService_UpdateWorkflowExecutionMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "uid", "metric"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| @@ -1897,4 +2165,8 @@ var ( | ||||
| 	forward_WorkflowService_CronStartWorkflowExecutionStatistic_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowService_UpdateWorkflowExecutionStatus_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowService_AddWorkflowExecutionMetrics_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowService_UpdateWorkflowExecutionMetrics_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
|   | ||||
| @@ -105,6 +105,20 @@ service WorkflowService { | ||||
|             body: "status" | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc AddWorkflowExecutionMetrics (AddWorkflowExecutionsMetricsRequest) returns (WorkflowExecutionsMetricsResponse) { | ||||
|         option (google.api.http) = { | ||||
|             post: "/apis/v1beta1/{namespace}/workflow_executions/{uid}/metric" | ||||
|             body: "*" | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc UpdateWorkflowExecutionMetrics (UpdateWorkflowExecutionsMetricsRequest) returns (WorkflowExecutionsMetricsResponse) { | ||||
|         option (google.api.http) = { | ||||
|             put: "/apis/v1beta1/{namespace}/workflow_executions/{uid}/metric" | ||||
|             body: "*" | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| message CreateWorkflowExecutionBody { | ||||
| @@ -214,6 +228,8 @@ message WorkflowExecution { | ||||
|     repeated KeyValue labels = 10; | ||||
|  | ||||
|     WorkflowExecutionMetadata metadata = 11; | ||||
|  | ||||
|     repeated Metric metrics = 12; | ||||
| } | ||||
|  | ||||
| message ArtifactResponse { | ||||
| @@ -274,4 +290,27 @@ message GetWorkflowExecutionStatisticsForNamespaceRequest { | ||||
|  | ||||
| message GetWorkflowExecutionStatisticsForNamespaceResponse { | ||||
|     WorkflowExecutionStatisticReport stats = 1; | ||||
| } | ||||
|  | ||||
| message AddWorkflowExecutionMetricRequest { | ||||
|     string namespace = 1; | ||||
|     string uid = 2; | ||||
|     Metric metric = 3; | ||||
| } | ||||
|  | ||||
| message AddWorkflowExecutionsMetricsRequest { | ||||
|     string namespace = 1; | ||||
|     string uid = 2; | ||||
|     bool override = 3; | ||||
|     repeated Metric metrics = 4; | ||||
| } | ||||
|  | ||||
| message UpdateWorkflowExecutionsMetricsRequest { | ||||
|     string namespace = 1; | ||||
|     string uid = 2; | ||||
|     repeated Metric metrics = 4; | ||||
| } | ||||
|  | ||||
| message WorkflowExecutionsMetricsResponse { | ||||
|     repeated Metric metrics = 4; | ||||
| } | ||||
| @@ -155,6 +155,10 @@ func printMarkDown(issues []*issue, version *string) { | ||||
| 	fmt.Println("# Contributors") | ||||
| 	contributors := make([]user, 0) | ||||
| 	for _, contributor := range contributorsMap { | ||||
| 		// Sorry, no bots. | ||||
| 		if contributor.Login == "dependabot[bot]" { | ||||
| 			continue | ||||
| 		} | ||||
| 		contributors = append(contributors, contributor) | ||||
| 	} | ||||
| 	sort.Slice(contributors, func(i, j int) bool { return contributors[i].ContributionsCount > contributors[j].ContributionsCount }) | ||||
|   | ||||
							
								
								
									
										147
									
								
								db/data/20201016170415_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								db/data/20201016170415_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| # Workspace arguments | ||||
| arguments: | ||||
|   parameters: | ||||
|     - name: sync-directory | ||||
|       displayName: Directory to sync raw input and training output | ||||
|       value: workflow-data | ||||
|       hint: Location to sync raw input, models and checkpoints from default object storage. Note that this will be relative to the current namespace. | ||||
| containers: | ||||
|   - name: cvat-db | ||||
|     image: postgres:10-alpine | ||||
|     env: | ||||
|       - name: POSTGRES_USER | ||||
|         value: root | ||||
|       - name: POSTGRES_DB | ||||
|         value: cvat | ||||
|       - name: POSTGRES_HOST_AUTH_METHOD | ||||
|         value: trust | ||||
|       - name: PGDATA | ||||
|         value: /var/lib/psql/data | ||||
|     ports: | ||||
|       - containerPort: 5432 | ||||
|         name: tcp | ||||
|     volumeMounts: | ||||
|       - name: db | ||||
|         mountPath: /var/lib/psql | ||||
|   - name: cvat-redis | ||||
|     image: redis:4.0-alpine | ||||
|     ports: | ||||
|       - containerPort: 6379 | ||||
|         name: tcp | ||||
|   - name: cvat | ||||
|     image: onepanel/cvat:0.14.0_cvat.1.0.0 | ||||
|     env: | ||||
|       - name: DJANGO_MODWSGI_EXTRA_ARGS | ||||
|         value: "" | ||||
|       - name: ALLOWED_HOSTS | ||||
|         value: '*' | ||||
|       - name: CVAT_REDIS_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_POSTGRES_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_SHARE_URL | ||||
|         value: /home/django/data | ||||
|       - name: ONEPANEL_SYNC_DIRECTORY | ||||
|         value: '{{workspace.parameters.sync-directory}}' | ||||
|       - name: NVIDIA_VISIBLE_DEVICES | ||||
|         value: all | ||||
|       - name: NVIDIA_DRIVER_CAPABILITIES | ||||
|         value: compute,utility | ||||
|       - name: NVIDIA_REQUIRE_CUDA | ||||
|         value: "cuda>=10.0 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=410,driver<411" | ||||
|     ports: | ||||
|       - containerPort: 8080 | ||||
|         name: http | ||||
|     volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /home/django/data | ||||
|       - name: keys | ||||
|         mountPath: /home/django/keys | ||||
|       - name: logs | ||||
|         mountPath: /home/django/logs | ||||
|       - name: models | ||||
|         mountPath: /home/django/models | ||||
|       - name: share | ||||
|         mountPath: /home/django/share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
|   - name: cvat-ui | ||||
|     image: onepanel/cvat-ui:0.14.0_cvat.1.0.0 | ||||
|     ports: | ||||
|       - containerPort: 80 | ||||
|         name: http | ||||
|   # You can add multiple FileSyncer sidecar containers if needed | ||||
|   - name: filesyncer | ||||
|     image: onepanel/filesyncer:{{.ArtifactRepositoryType}} | ||||
|     imagePullPolicy: Always | ||||
|     args: | ||||
|       - download | ||||
|       - -server-prefix=/sys/filesyncer | ||||
|     env: | ||||
|       - name: FS_PATH | ||||
|         value: /mnt/share | ||||
|       - name: FS_PREFIX | ||||
|         value: '{{workflow.namespace}}/{{workspace.parameters.sync-directory}}' | ||||
|     volumeMounts: | ||||
|       - name: share | ||||
|         mountPath: /mnt/share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
| ports: | ||||
|   - name: cvat-ui | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 80 | ||||
|   - name: cvat | ||||
|     port: 8080 | ||||
|     protocol: TCP | ||||
|     targetPort: 8080 | ||||
|   - name: fs | ||||
|     port: 8888 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /sys/filesyncer | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8888 | ||||
|   - match: | ||||
|       - uri: | ||||
|           regex: /api/.*|/git/.*|/tensorflow/.*|/onepanelio/.*|/tracking/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|       - queryParams: | ||||
|           id: | ||||
|             regex: \d+.* | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8080 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| # Uncomment the lines below if you want to send Slack notifications | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #     container: | ||||
| #       image: technosophos/slack-notify | ||||
| #       args: | ||||
| #       - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #       command: | ||||
| #       - sh | ||||
| #       - -c | ||||
							
								
								
									
										77
									
								
								db/data/20201028145442_jupyterlab.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								db/data/20201028145442_jupyterlab.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| # Docker containers that are part of the Workspace | ||||
| containers: | ||||
|   - name: jupyterlab | ||||
|     image: onepanel/jupyterlab:1.0.1 | ||||
|     command: ["/bin/bash", "-c", "pip install onepanel-sdk && start.sh jupyter lab --LabApp.token='' --LabApp.allow_remote_access=True --LabApp.allow_origin=\"*\" --LabApp.disable_check_xsrf=True --LabApp.trust_xheaders=True --LabApp.base_url=/ --LabApp.tornado_settings='{\"headers\":{\"Content-Security-Policy\":\"frame-ancestors * \'self\'\"}}' --notebook-dir='/data' --allow-root"] | ||||
|     env: | ||||
|       - name: tornado | ||||
|         value: "'{'headers':{'Content-Security-Policy':\"frame-ancestors\ *\ \'self'\"}}'" | ||||
|     ports: | ||||
|       - containerPort: 8888 | ||||
|         name: jupyterlab | ||||
|       - containerPort: 6006 | ||||
|         name: tensorboard | ||||
|     volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /data | ||||
|     lifecycle: | ||||
|       postStart: | ||||
|         exec: | ||||
|           command: | ||||
|             - /bin/sh | ||||
|             - -c | ||||
|             - > | ||||
|               condayml="/data/.environment.yml"; | ||||
|               jupytertxt="/data/.jupexported.txt"; | ||||
|               if [ -f "$condayml" ]; then conda env update -f $condayml; fi; | ||||
|               if [ -f "$jupytertxt" ]; then cat $jupytertxt | xargs -n 1 jupyter labextension install --no-build && jupyter lab build --minimize=False; fi; | ||||
|       preStop: | ||||
|         exec: | ||||
|           command: | ||||
|             - /bin/sh | ||||
|             - -c | ||||
|             - > | ||||
|               conda env export > /data/.environment.yml -n base; | ||||
|               jupyter labextension list 1>/dev/null 2> /data/.jup.txt; | ||||
|               cat /data/.jup.txt | sed -n '2,$p' | awk 'sub(/v/,"@", $2){print $1$2}' > /data/.jupexported.txt; | ||||
| ports: | ||||
|   - name: jupyterlab | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
|   - name: tensorboard | ||||
|     port: 6006 | ||||
|     protocol: TCP | ||||
|     targetPort: 6006 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /tensorboard | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 6006 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / #jupyter runs at the default route | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #    container: | ||||
| #      image: technosophos/slack-notify | ||||
| #      args: | ||||
| #      - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #      command: | ||||
| #      - sh | ||||
| #      - -c | ||||
							
								
								
									
										79
									
								
								db/data/20201031165106_jupyterlab.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								db/data/20201031165106_jupyterlab.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| # Docker containers that are part of the Workspace | ||||
| containers: | ||||
|   - name: jupyterlab | ||||
|     image: onepanel/jupyterlab:1.0.1 | ||||
|     command: ["/bin/bash", "-c", "pip install onepanel-sdk && start.sh jupyter lab --LabApp.token='' --LabApp.allow_remote_access=True --LabApp.allow_origin=\"*\" --LabApp.disable_check_xsrf=True --LabApp.trust_xheaders=True --LabApp.base_url=/ --LabApp.tornado_settings='{\"headers\":{\"Content-Security-Policy\":\"frame-ancestors * \'self\'\"}}' --notebook-dir='/data' --allow-root"] | ||||
|     env: | ||||
|       - name: tornado | ||||
|         value: "'{'headers':{'Content-Security-Policy':\"frame-ancestors\ *\ \'self'\"}}'" | ||||
|       - name: TENSORBOARD_PROXY_URL | ||||
|         value: '//$(ONEPANEL_RESOURCE_UID)--$(ONEPANEL_RESOURCE_NAMESPACE).$(ONEPANEL_DOMAIN)/tensorboard' | ||||
|     ports: | ||||
|       - containerPort: 8888 | ||||
|         name: jupyterlab | ||||
|       - containerPort: 6006 | ||||
|         name: tensorboard | ||||
|     volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /data | ||||
|     lifecycle: | ||||
|       postStart: | ||||
|         exec: | ||||
|           command: | ||||
|             - /bin/sh | ||||
|             - -c | ||||
|             - > | ||||
|               condayml="/data/.environment.yml"; | ||||
|               jupytertxt="/data/.jupexported.txt"; | ||||
|               if [ -f "$condayml" ]; then conda env update -f $condayml; fi; | ||||
|               if [ -f "$jupytertxt" ]; then cat $jupytertxt | xargs -n 1 jupyter labextension install --no-build && jupyter lab build --minimize=False; fi; | ||||
|       preStop: | ||||
|         exec: | ||||
|           command: | ||||
|             - /bin/sh | ||||
|             - -c | ||||
|             - > | ||||
|               conda env export > /data/.environment.yml -n base; | ||||
|               jupyter labextension list 1>/dev/null 2> /data/.jup.txt; | ||||
|               cat /data/.jup.txt | sed -n '2,$p' | awk 'sub(/v/,"@", $2){print $1$2}' > /data/.jupexported.txt; | ||||
| ports: | ||||
|   - name: jupyterlab | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
|   - name: tensorboard | ||||
|     port: 6006 | ||||
|     protocol: TCP | ||||
|     targetPort: 6006 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /tensorboard | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 6006 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / #jupyter runs at the default route | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #    container: | ||||
| #      image: technosophos/slack-notify | ||||
| #      args: | ||||
| #      - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #      command: | ||||
| #      - sh | ||||
| #      - -c | ||||
							
								
								
									
										159
									
								
								db/data/20201102104048_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								db/data/20201102104048_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| # Workspace arguments | ||||
| arguments: | ||||
|   parameters: | ||||
|     - name: sync-directory | ||||
|       displayName: Directory to sync raw input and training output | ||||
|       value: workflow-data | ||||
|       hint: Location (relative to current namespace) to sync raw input, models and checkpoints from default object storage to '/share'. | ||||
| containers: | ||||
|   - name: cvat-db | ||||
|     image: postgres:10-alpine | ||||
|     env: | ||||
|       - name: POSTGRES_USER | ||||
|         value: root | ||||
|       - name: POSTGRES_DB | ||||
|         value: cvat | ||||
|       - name: POSTGRES_HOST_AUTH_METHOD | ||||
|         value: trust | ||||
|       - name: PGDATA | ||||
|         value: /var/lib/psql/data | ||||
|     ports: | ||||
|       - containerPort: 5432 | ||||
|         name: tcp | ||||
|     volumeMounts: | ||||
|       - name: db | ||||
|         mountPath: /var/lib/psql | ||||
|   - name: cvat-redis | ||||
|     image: redis:4.0-alpine | ||||
|     ports: | ||||
|       - containerPort: 6379 | ||||
|         name: tcp | ||||
|   - name: cvat | ||||
|     image: onepanel/cvat:0.15.0_cvat.1.0.0 | ||||
|     env: | ||||
|       - name: DJANGO_MODWSGI_EXTRA_ARGS | ||||
|         value: "" | ||||
|       - name: ALLOWED_HOSTS | ||||
|         value: '*' | ||||
|       - name: CVAT_REDIS_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_POSTGRES_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_SHARE_URL | ||||
|         value: /cvat/data | ||||
|       - name: CVAT_SHARE_DIR | ||||
|         value: /share | ||||
|       - name: CVAT_KEYS_DIR | ||||
|         value: /cvat/keys | ||||
|       - name: CVAT_DATA_DIR | ||||
|         value: /cvat/data | ||||
|       - name: CVAT_MODELS_DIR | ||||
|         value: /cvat/models | ||||
|       - name: CVAT_LOGS_DIR | ||||
|         value: /cvat/logs | ||||
|       - name: ONEPANEL_SYNC_DIRECTORY | ||||
|         value: '{{workspace.parameters.sync-directory}}' | ||||
|       - name: NVIDIA_VISIBLE_DEVICES | ||||
|         value: all | ||||
|       - name: NVIDIA_DRIVER_CAPABILITIES | ||||
|         value: compute,utility | ||||
|       - name: NVIDIA_REQUIRE_CUDA | ||||
|         value: "cuda>=10.0 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=410,driver<411" | ||||
|     ports: | ||||
|       - containerPort: 8080 | ||||
|         name: http | ||||
|     volumeMounts: | ||||
|       - name: cvat-data | ||||
|         mountPath: /cvat | ||||
|       - name: share | ||||
|         mountPath: /share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
|   - name: cvat-ui | ||||
|     image: onepanel/cvat-ui:0.15.0_cvat.1.0.0 | ||||
|     ports: | ||||
|       - containerPort: 80 | ||||
|         name: http | ||||
|   # You can add multiple FileSyncer sidecar containers if needed | ||||
|   - name: filesyncer | ||||
|     image: onepanel/filesyncer:s3 | ||||
|     imagePullPolicy: Always | ||||
|     args: | ||||
|       - download | ||||
|       - -server-prefix=/sys/filesyncer | ||||
|     env: | ||||
|       - name: FS_PATH | ||||
|         value: /mnt/share | ||||
|       - name: FS_PREFIX | ||||
|         value: '{{workflow.namespace}}/{{workspace.parameters.sync-directory}}' | ||||
|     volumeMounts: | ||||
|       - name: share | ||||
|         mountPath: /mnt/share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
| ports: | ||||
|   - name: cvat-ui | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 80 | ||||
|   - name: cvat | ||||
|     port: 8080 | ||||
|     protocol: TCP | ||||
|     targetPort: 8080 | ||||
|   - name: fs | ||||
|     port: 8888 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /sys/filesyncer | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8888 | ||||
|   - match: | ||||
|       - uri: | ||||
|           regex: /api/.*|/git/.*|/tensorflow/.*|/onepanelio/.*|/tracking/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|       - queryParams: | ||||
|           id: | ||||
|             regex: \d+.* | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8080 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: db | ||||
|     spec: | ||||
|       accessModes: ["ReadWriteOnce"] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 20Gi | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| # Uncomment the lines below if you want to send Slack notifications | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #     container: | ||||
| #       image: technosophos/slack-notify | ||||
| #       args: | ||||
| #       - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #       command: | ||||
| #       - sh | ||||
| #       - -c | ||||
							
								
								
									
										159
									
								
								db/data/20201113094916_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								db/data/20201113094916_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| # Workspace arguments | ||||
| arguments: | ||||
|   parameters: | ||||
|     - name: sync-directory | ||||
|       displayName: Directory to sync raw input and training output | ||||
|       value: workflow-data | ||||
|       hint: Location (relative to current namespace) to sync raw input, models and checkpoints from default object storage to '/share'. | ||||
| containers: | ||||
|   - name: cvat-db | ||||
|     image: postgres:10-alpine | ||||
|     env: | ||||
|       - name: POSTGRES_USER | ||||
|         value: root | ||||
|       - name: POSTGRES_DB | ||||
|         value: cvat | ||||
|       - name: POSTGRES_HOST_AUTH_METHOD | ||||
|         value: trust | ||||
|       - name: PGDATA | ||||
|         value: /var/lib/psql/data | ||||
|     ports: | ||||
|       - containerPort: 5432 | ||||
|         name: tcp | ||||
|     volumeMounts: | ||||
|       - name: db | ||||
|         mountPath: /var/lib/psql | ||||
|   - name: cvat-redis | ||||
|     image: redis:4.0-alpine | ||||
|     ports: | ||||
|       - containerPort: 6379 | ||||
|         name: tcp | ||||
|   - name: cvat | ||||
|     image: onepanel/cvat:0.16.0_cvat.1.0.0 | ||||
|     env: | ||||
|       - name: DJANGO_MODWSGI_EXTRA_ARGS | ||||
|         value: "" | ||||
|       - name: ALLOWED_HOSTS | ||||
|         value: '*' | ||||
|       - name: CVAT_REDIS_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_POSTGRES_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_SHARE_URL | ||||
|         value: /cvat/data | ||||
|       - name: CVAT_SHARE_DIR | ||||
|         value: /share | ||||
|       - name: CVAT_KEYS_DIR | ||||
|         value: /cvat/keys | ||||
|       - name: CVAT_DATA_DIR | ||||
|         value: /cvat/data | ||||
|       - name: CVAT_MODELS_DIR | ||||
|         value: /cvat/models | ||||
|       - name: CVAT_LOGS_DIR | ||||
|         value: /cvat/logs | ||||
|       - name: ONEPANEL_SYNC_DIRECTORY | ||||
|         value: '{{workspace.parameters.sync-directory}}' | ||||
|       - name: NVIDIA_VISIBLE_DEVICES | ||||
|         value: all | ||||
|       - name: NVIDIA_DRIVER_CAPABILITIES | ||||
|         value: compute,utility | ||||
|       - name: NVIDIA_REQUIRE_CUDA | ||||
|         value: "cuda>=10.0 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=410,driver<411" | ||||
|     ports: | ||||
|       - containerPort: 8080 | ||||
|         name: http | ||||
|     volumeMounts: | ||||
|       - name: cvat-data | ||||
|         mountPath: /cvat | ||||
|       - name: share | ||||
|         mountPath: /share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
|   - name: cvat-ui | ||||
|     image: onepanel/cvat-ui:0.16.0_cvat.1.0.0 | ||||
|     ports: | ||||
|       - containerPort: 80 | ||||
|         name: http | ||||
|   # You can add multiple FileSyncer sidecar containers if needed | ||||
|   - name: filesyncer | ||||
|     image: onepanel/filesyncer:s3 | ||||
|     imagePullPolicy: Always | ||||
|     args: | ||||
|       - download | ||||
|       - -server-prefix=/sys/filesyncer | ||||
|     env: | ||||
|       - name: FS_PATH | ||||
|         value: /mnt/share | ||||
|       - name: FS_PREFIX | ||||
|         value: '{{workflow.namespace}}/{{workspace.parameters.sync-directory}}' | ||||
|     volumeMounts: | ||||
|       - name: share | ||||
|         mountPath: /mnt/share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
| ports: | ||||
|   - name: cvat-ui | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 80 | ||||
|   - name: cvat | ||||
|     port: 8080 | ||||
|     protocol: TCP | ||||
|     targetPort: 8080 | ||||
|   - name: fs | ||||
|     port: 8888 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /sys/filesyncer | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8888 | ||||
|   - match: | ||||
|       - uri: | ||||
|           regex: /api/.*|/git/.*|/tensorflow/.*|/onepanelio/.*|/tracking/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|       - queryParams: | ||||
|           id: | ||||
|             regex: \d+.* | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8080 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: db | ||||
|     spec: | ||||
|       accessModes: ["ReadWriteOnce"] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 20Gi | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| # Uncomment the lines below if you want to send Slack notifications | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #     container: | ||||
| #       image: technosophos/slack-notify | ||||
| #       args: | ||||
| #       - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #       command: | ||||
| #       - sh | ||||
| #       - -c | ||||
							
								
								
									
										161
									
								
								db/data/20201115133046_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								db/data/20201115133046_cvat.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| # Workspace arguments | ||||
| arguments: | ||||
|   parameters: | ||||
|     - name: sync-directory | ||||
|       displayName: Directory to sync raw input and training output | ||||
|       value: workflow-data | ||||
|       hint: Location (relative to current namespace) to sync raw input, models and checkpoints from default object storage to '/share'. | ||||
| containers: | ||||
|   - name: cvat-db | ||||
|     image: postgres:10-alpine | ||||
|     env: | ||||
|       - name: POSTGRES_USER | ||||
|         value: root | ||||
|       - name: POSTGRES_DB | ||||
|         value: cvat | ||||
|       - name: POSTGRES_HOST_AUTH_METHOD | ||||
|         value: trust | ||||
|       - name: PGDATA | ||||
|         value: /var/lib/psql/data | ||||
|     ports: | ||||
|       - containerPort: 5432 | ||||
|         name: tcp | ||||
|     volumeMounts: | ||||
|       - name: db | ||||
|         mountPath: /var/lib/psql | ||||
|   - name: cvat-redis | ||||
|     image: redis:4.0-alpine | ||||
|     ports: | ||||
|       - containerPort: 6379 | ||||
|         name: tcp | ||||
|   - name: cvat | ||||
|     image: onepanel/cvat:0.16.0_cvat.1.0.0 | ||||
|     env: | ||||
|       - name: DJANGO_MODWSGI_EXTRA_ARGS | ||||
|         value: "" | ||||
|       - name: ALLOWED_HOSTS | ||||
|         value: '*' | ||||
|       - name: CVAT_REDIS_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_POSTGRES_HOST | ||||
|         value: localhost | ||||
|       - name: CVAT_SHARE_URL | ||||
|         value: /cvat/data | ||||
|       - name: CVAT_SHARE_DIR | ||||
|         value: /share | ||||
|       - name: CVAT_DATA_DIR | ||||
|         value: /cvat/data | ||||
|       - name: CVAT_MEDIA_DATA_DIR | ||||
|         value: /cvat/data/data | ||||
|       - name: CVAT_KEYS_DIR | ||||
|         value: /cvat/data/keys | ||||
|       - name: CVAT_MODELS_DIR | ||||
|         value: /cvat/data/models | ||||
|       - name: CVAT_LOGS_DIR | ||||
|         value: /cvat/logs | ||||
|       - name: ONEPANEL_SYNC_DIRECTORY | ||||
|         value: '{{workspace.parameters.sync-directory}}' | ||||
|       - name: NVIDIA_VISIBLE_DEVICES | ||||
|         value: all | ||||
|       - name: NVIDIA_DRIVER_CAPABILITIES | ||||
|         value: compute,utility | ||||
|       - name: NVIDIA_REQUIRE_CUDA | ||||
|         value: "cuda>=10.0 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=410,driver<411" | ||||
|     ports: | ||||
|       - containerPort: 8080 | ||||
|         name: http | ||||
|     volumeMounts: | ||||
|       - name: cvat-data | ||||
|         mountPath: /cvat | ||||
|       - name: share | ||||
|         mountPath: /share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
|   - name: cvat-ui | ||||
|     image: onepanel/cvat-ui:0.16.0_cvat.1.0.0 | ||||
|     ports: | ||||
|       - containerPort: 80 | ||||
|         name: http | ||||
|   # You can add multiple FileSyncer sidecar containers if needed | ||||
|   - name: filesyncer | ||||
|     image: onepanel/filesyncer:s3 | ||||
|     imagePullPolicy: Always | ||||
|     args: | ||||
|       - download | ||||
|       - -server-prefix=/sys/filesyncer | ||||
|     env: | ||||
|       - name: FS_PATH | ||||
|         value: /mnt/share | ||||
|       - name: FS_PREFIX | ||||
|         value: '{{workflow.namespace}}/{{workspace.parameters.sync-directory}}' | ||||
|     volumeMounts: | ||||
|       - name: share | ||||
|         mountPath: /mnt/share | ||||
|       - name: sys-namespace-config | ||||
|         mountPath: /etc/onepanel | ||||
|         readOnly: true | ||||
| ports: | ||||
|   - name: cvat-ui | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 80 | ||||
|   - name: cvat | ||||
|     port: 8080 | ||||
|     protocol: TCP | ||||
|     targetPort: 8080 | ||||
|   - name: fs | ||||
|     port: 8888 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /sys/filesyncer | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8888 | ||||
|   - match: | ||||
|       - uri: | ||||
|           regex: /api/.*|/git/.*|/tensorflow/.*|/onepanelio/.*|/tracking/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|       - queryParams: | ||||
|           id: | ||||
|             regex: \d+.* | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8080 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: db | ||||
|     spec: | ||||
|       accessModes: ["ReadWriteOnce"] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 20Gi | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| # Uncomment the lines below if you want to send Slack notifications | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #     container: | ||||
| #       image: technosophos/slack-notify | ||||
| #       args: | ||||
| #       - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #       command: | ||||
| #       - sh | ||||
| #       - -c | ||||
							
								
								
									
										221
									
								
								db/data/20201115134934_tfod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								db/data/20201115134934_tfod.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | ||||
| entrypoint: main | ||||
| arguments: | ||||
|   parameters: | ||||
|     - name: source | ||||
|       value: https://github.com/tensorflow/models.git | ||||
|       displayName: Model source code | ||||
|       type: hidden | ||||
|       visibility: private | ||||
|  | ||||
|     - name: trainingsource | ||||
|       value: https://github.com/onepanelio/cvat-training.git | ||||
|       type: hidden | ||||
|       visibility: private | ||||
|  | ||||
|     - name: revision | ||||
|       value: v1.13.0 | ||||
|       type: hidden | ||||
|       visibility: private | ||||
|  | ||||
|     - name: cvat-annotation-path | ||||
|       value: annotation-dump/sample_dataset | ||||
|       displayName: Dataset path | ||||
|       hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. | ||||
|       visibility: private | ||||
|  | ||||
|     - name: cvat-output-path | ||||
|       value: workflow-data/output/sample_output | ||||
|       hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. | ||||
|       displayName: Workflow output path | ||||
|       visibility: private | ||||
|  | ||||
|     - name: cvat-model | ||||
|       value: frcnn-res50-coco | ||||
|       displayName: Model | ||||
|       hint: TF Detection API's model to use for training. | ||||
|       type: select.select | ||||
|       visibility: public | ||||
|       options: | ||||
|         - name: 'Faster RCNN-ResNet 101-COCO' | ||||
|           value: frcnn-res101-coco | ||||
|         - name: 'Faster RCNN-ResNet 101-Low Proposal-COCO' | ||||
|           value: frcnn-res101-low | ||||
|         - name: 'Faster RCNN-ResNet 50-COCO' | ||||
|           value: frcnn-res50-coco | ||||
|         - name: 'Faster RCNN-NAS-COCO' | ||||
|           value: frcnn-nas-coco | ||||
|         - name: 'SSD MobileNet V1-COCO' | ||||
|           value: ssd-mobilenet-v1-coco2 | ||||
|         - name: 'SSD MobileNet V2-COCO' | ||||
|           value: ssd-mobilenet-v2-coco | ||||
|         - name: 'SSDLite MobileNet-COCO' | ||||
|           value: ssdlite-mobilenet-coco | ||||
|  | ||||
|     - name: hyperparameters | ||||
|       value: |- | ||||
|         num-steps=10000 | ||||
|       displayName: Hyperparameters | ||||
|       visibility: public | ||||
|       type: textarea.textarea | ||||
|       hint: "Please refer to our <a href='https://docs.onepanel.ai/docs/getting-started/use-cases/computervision/annotation/cvat/cvat_annotation_model#arguments-optional' target='_blank'>documentation</a> for more information on parameters. Number of classes will be automatically populated if you had 'sys-num-classes' parameter in a workflow." | ||||
|  | ||||
|     - name: cvat-finetune-checkpoint | ||||
|       value: '' | ||||
|       hint: Select the last fine-tune checkpoint for this model. It may take up to 5 minutes for a recent checkpoint show here. Leave empty if this is the first time you're training this model. | ||||
|       displayName: Checkpoint path | ||||
|       visibility: public | ||||
|  | ||||
|     - name: cvat-num-classes | ||||
|       value: '81' | ||||
|       hint: Number of classes | ||||
|       displayName: Number of classes | ||||
|       visibility: private | ||||
|  | ||||
|     - name: tf-image | ||||
|       value: tensorflow/tensorflow:1.13.1-py3 | ||||
|       type: select.select | ||||
|       displayName: Select TensorFlow image | ||||
|       visibility: public | ||||
|       hint: Select the GPU image if you are running on a GPU node pool | ||||
|       options: | ||||
|         - name: 'TensorFlow 1.13.1 CPU Image' | ||||
|           value: 'tensorflow/tensorflow:1.13.1-py3' | ||||
|         - name: 'TensorFlow 1.13.1 GPU Image' | ||||
|           value: 'tensorflow/tensorflow:1.13.1-gpu-py3' | ||||
|  | ||||
|     - displayName: Node pool | ||||
|       hint: Name of node pool or group to run this workflow task | ||||
|       type: select.select | ||||
|       name: sys-node-pool | ||||
|       value: Standard_D4s_v3 | ||||
|       visibility: public | ||||
|       required: true | ||||
|       options: | ||||
|         - name: 'CPU: 2, RAM: 8GB' | ||||
|           value: Standard_D2s_v3 | ||||
|         - name: 'CPU: 4, RAM: 16GB' | ||||
|           value: Standard_D4s_v3 | ||||
|         - name: 'GPU: 1xK80, CPU: 6, RAM: 56GB' | ||||
|           value: Standard_NC6 | ||||
|     - name: dump-format | ||||
|       value: cvat_tfrecord | ||||
|       visibility: public | ||||
| templates: | ||||
|   - name: main | ||||
|     dag: | ||||
|       tasks: | ||||
|         - name: train-model | ||||
|           template: tensorflow | ||||
|     # Uncomment the lines below if you want to send Slack notifications | ||||
|     #    - arguments: | ||||
|     #        artifacts: | ||||
|     #        - from: '{{tasks.train-model.outputs.artifacts.sys-metrics}}' | ||||
|     #          name: metrics | ||||
|     #        parameters: | ||||
|     #        - name: status | ||||
|     #          value: '{{tasks.train-model.status}}' | ||||
|     #      dependencies: | ||||
|     #      - train-model | ||||
|     #      name: notify-in-slack | ||||
|     #      template: slack-notify-success | ||||
|   - name: tensorflow | ||||
|     container: | ||||
|       args: | ||||
|         - | | ||||
|           apt-get update && \ | ||||
|           apt-get install -y python3-pip git wget unzip libglib2.0-0 libsm6 libxext6 libxrender-dev && \ | ||||
|           pip install pillow lxml Cython contextlib2 jupyter matplotlib numpy scipy boto3 pycocotools pyyaml google-cloud-storage && \ | ||||
|           cd /mnt/src/tf/research && \ | ||||
|           export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim && \ | ||||
|           cd /mnt/src/train && \ | ||||
|           python convert_workflow.py \ | ||||
|             --extras="{{workflow.parameters.hyperparameters}}" \ | ||||
|             --model="{{workflow.parameters.cvat-model}}" \ | ||||
|             --num_classes="{{workflow.parameters.cvat-num-classes}}" \ | ||||
|             --sys_finetune_checkpoint={{workflow.parameters.cvat-finetune-checkpoint}} | ||||
|       command: | ||||
|         - sh | ||||
|         - -c | ||||
|       image: '{{workflow.parameters.tf-image}}' | ||||
|       volumeMounts: | ||||
|         - mountPath: /mnt/data | ||||
|           name: data | ||||
|         - mountPath: /mnt/output | ||||
|           name: output | ||||
|       workingDir: /mnt/src | ||||
|     nodeSelector: | ||||
|       beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' | ||||
|     sidecars: | ||||
|       - name: tensorboard | ||||
|         image: tensorflow/tensorflow:2.3.0 | ||||
|         command: [sh, -c] | ||||
|         tty: true | ||||
|         args: ["tensorboard --logdir /mnt/output/"] | ||||
|         ports: | ||||
|           - containerPort: 6006 | ||||
|             name: tensorboard | ||||
|     inputs: | ||||
|       artifacts: | ||||
|         - name: data | ||||
|           path: /mnt/data/datasets/ | ||||
|           {{.ArtifactRepositoryType}}: | ||||
|             key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' | ||||
|         - name: models | ||||
|           path: /mnt/data/models/ | ||||
|           optional: true | ||||
|           {{.ArtifactRepositoryType}}: | ||||
|             key: '{{workflow.namespace}}/{{workflow.parameters.cvat-finetune-checkpoint}}' | ||||
|         - git: | ||||
|             repo: '{{workflow.parameters.source}}' | ||||
|             revision: '{{workflow.parameters.revision}}' | ||||
|           name: src | ||||
|           path: /mnt/src/tf | ||||
|         - git: | ||||
|             repo: '{{workflow.parameters.trainingsource}}' | ||||
|             revision: 'optional-artifacts' | ||||
|           name: tsrc | ||||
|           path: /mnt/src/train | ||||
|     outputs: | ||||
|       artifacts: | ||||
|         - name: model | ||||
|           optional: true | ||||
|           path: /mnt/output | ||||
|           {{.ArtifactRepositoryType}}: | ||||
|             key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' | ||||
| # Uncomment the lines below if you want to send Slack notifications | ||||
| #- container: | ||||
| #    args: | ||||
| #    - SLACK_USERNAME=Onepanel SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" | ||||
| #      SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd | ||||
| #      SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify | ||||
| #    command: | ||||
| #    - sh | ||||
| #    - -c | ||||
| #    image: technosophos/slack-notify | ||||
| #  inputs: | ||||
| #    artifacts: | ||||
| #    - name: metrics | ||||
| #      optional: true | ||||
| #      path: /tmp/metrics.json | ||||
| #    parameters: | ||||
| #    - name: status | ||||
| #  name: slack-notify-success | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       creationTimestamp: null | ||||
|       name: data | ||||
|     spec: | ||||
|       accessModes: | ||||
|         - ReadWriteOnce | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 200Gi | ||||
|   - metadata: | ||||
|       creationTimestamp: null | ||||
|       name: output | ||||
|     spec: | ||||
|       accessModes: | ||||
|         - ReadWriteOnce | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 200Gi | ||||
							
								
								
									
										190
									
								
								db/data/20201115145814_maskrcnn.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								db/data/20201115145814_maskrcnn.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | ||||
| entrypoint: main | ||||
| arguments: | ||||
|   parameters: | ||||
|     - name: source | ||||
|       value: https://github.com/onepanelio/Mask_RCNN.git | ||||
|       displayName: Model source code | ||||
|       type: hidden | ||||
|       visibility: private | ||||
|  | ||||
|     - name: cvat-annotation-path | ||||
|       value: annotation-dump/sample_dataset | ||||
|       hint: Path to annotated data in default object storage (i.e S3). In CVAT, this parameter will be pre-populated. | ||||
|       displayName: Dataset path | ||||
|       visibility: private | ||||
|  | ||||
|     - name: cvat-output-path | ||||
|       value: workflow-data/output/sample_output | ||||
|       hint: Path to store output artifacts in default object storage (i.e s3). In CVAT, this parameter will be pre-populated. | ||||
|       displayName: Workflow output path | ||||
|       visibility: private | ||||
|  | ||||
|     - name: cvat-finetune-checkpoint | ||||
|       value: '' | ||||
|       hint: Select the last fine-tune checkpoint for this model. It may take up to 5 minutes for a recent checkpoint show here. Leave empty if this is the first time you're training this model. | ||||
|       displayName: Checkpoint path | ||||
|       visibility: public | ||||
|  | ||||
|     - name: cvat-num-classes | ||||
|       displayName: Number of classes | ||||
|       hint: Number of classes (i.e in CVAT taks) + 1 for background | ||||
|       value: '81' | ||||
|       visibility: private | ||||
|  | ||||
|     - name: hyperparameters | ||||
|       displayName: Hyperparameters | ||||
|       visibility: public | ||||
|       type: textarea.textarea | ||||
|       value: |- | ||||
|         stage-1-epochs=1    #  Epochs for network heads | ||||
|         stage-2-epochs=2    #  Epochs for finetune layers | ||||
|         stage-3-epochs=3    #  Epochs for all layers | ||||
|       hint: "Please refer to our <a href='https://docs.onepanel.ai/docs/getting-started/use-cases/computervision/annotation/cvat/cvat_annotation_model#arguments-optional' target='_blank'>documentation</a> for more information on parameters. Number of classes will be automatically populated if you had 'sys-num-classes' parameter in a workflow." | ||||
|  | ||||
|     - name: dump-format | ||||
|       value: cvat_coco | ||||
|       displayName: CVAT dump format | ||||
|       visibility: public | ||||
|  | ||||
|     - name: tf-image | ||||
|       visibility: public | ||||
|       value: tensorflow/tensorflow:1.13.1-py3 | ||||
|       type: select.select | ||||
|       displayName: Select TensorFlow image | ||||
|       hint: Select the GPU image if you are running on a GPU node pool | ||||
|       options: | ||||
|         - name: 'TensorFlow 1.13.1 CPU Image' | ||||
|           value: 'tensorflow/tensorflow:1.13.1-py3' | ||||
|         - name: 'TensorFlow 1.13.1 GPU Image' | ||||
|           value: 'tensorflow/tensorflow:1.13.1-gpu-py3' | ||||
|  | ||||
|     - displayName: Node pool | ||||
|       hint: Name of node pool or group to run this workflow task | ||||
|       type: select.select | ||||
|       visibility: public | ||||
|       name: sys-node-pool | ||||
|       value: Standard_D4s_v3 | ||||
|       required: true | ||||
|       options: | ||||
|         - name: 'CPU: 2, RAM: 8GB' | ||||
|           value: Standard_D2s_v3 | ||||
|         - name: 'CPU: 4, RAM: 16GB' | ||||
|           value: Standard_D4s_v3 | ||||
|         - name: 'GPU: 1xK80, CPU: 6, RAM: 56GB' | ||||
|           value: Standard_NC6 | ||||
| templates: | ||||
|   - name: main | ||||
|     dag: | ||||
|       tasks: | ||||
|         - name: train-model | ||||
|           template: tensorflow | ||||
|     # Uncomment the lines below if you want to send Slack notifications | ||||
|     #    - arguments: | ||||
|     #        artifacts: | ||||
|     #        - from: '{{tasks.train-model.outputs.artifacts.sys-metrics}}' | ||||
|     #          name: metrics | ||||
|     #        parameters: | ||||
|     #        - name: status | ||||
|     #          value: '{{tasks.train-model.status}}' | ||||
|     #      dependencies: | ||||
|     #      - train-model | ||||
|     #      name: notify-in-slack | ||||
|     #      template: slack-notify-success | ||||
|   - name: tensorflow | ||||
|     container: | ||||
|       args: | ||||
|         - | | ||||
|           apt-get update \ | ||||
|           && apt-get install -y git wget libglib2.0-0 libsm6 libxext6 libxrender-dev \ | ||||
|           && pip install -r requirements.txt \ | ||||
|           && pip install boto3 pyyaml google-cloud-storage \ | ||||
|           && git clone https://github.com/waleedka/coco \ | ||||
|           && cd coco/PythonAPI \ | ||||
|           && python setup.py build_ext install \ | ||||
|           && rm -rf build \ | ||||
|           && cd ../../ \ | ||||
|           && wget https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5 \ | ||||
|           && python setup.py install && ls \ | ||||
|           && python samples/coco/cvat.py train --dataset=/mnt/data/datasets \ | ||||
|             --model=workflow_maskrcnn \ | ||||
|             --extras="{{workflow.parameters.hyperparameters}}"  \ | ||||
|             --ref_model_path="{{workflow.parameters.cvat-finetune-checkpoint}}"  \ | ||||
|             --num_classes="{{workflow.parameters.cvat-num-classes}}" \ | ||||
|           && cd /mnt/src/ \ | ||||
|           && python prepare_dataset.py /mnt/data/datasets/annotations/instances_default.json | ||||
|       command: | ||||
|         - sh | ||||
|         - -c | ||||
|       image: '{{workflow.parameters.tf-image}}' | ||||
|       volumeMounts: | ||||
|         - mountPath: /mnt/data | ||||
|           name: data | ||||
|         - mountPath: /mnt/output | ||||
|           name: output | ||||
|       workingDir: /mnt/src | ||||
|     nodeSelector: | ||||
|       beta.kubernetes.io/instance-type: '{{workflow.parameters.sys-node-pool}}' | ||||
|     sidecars: | ||||
|       - name: tensorboard | ||||
|         image: tensorflow/tensorflow:2.3.0 | ||||
|         command: [sh, -c] | ||||
|         tty: true | ||||
|         args: ["tensorboard --logdir /mnt/output/"] | ||||
|         ports: | ||||
|           - containerPort: 6006 | ||||
|             name: tensorboard | ||||
|     inputs: | ||||
|       artifacts: | ||||
|         - name: data | ||||
|           path: /mnt/data/datasets/ | ||||
|           {{.ArtifactRepositoryType}}: | ||||
|             key: '{{workflow.namespace}}/{{workflow.parameters.cvat-annotation-path}}' | ||||
|         - git: | ||||
|             repo: '{{workflow.parameters.source}}' | ||||
|             revision: "no-boto" | ||||
|           name: src | ||||
|           path: /mnt/src | ||||
|     outputs: | ||||
|       artifacts: | ||||
|         - name: model | ||||
|           optional: true | ||||
|           path: /mnt/output | ||||
|           {{.ArtifactRepositoryType}}: | ||||
|             key: '{{workflow.namespace}}/{{workflow.parameters.cvat-output-path}}/{{workflow.name}}' | ||||
| # Uncomment the lines below if you want to send Slack notifications | ||||
| #- container: | ||||
| #    args: | ||||
| #    - SLACK_USERNAME=Onepanel SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" | ||||
| #      SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd | ||||
| #      SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify | ||||
| #    command: | ||||
| #    - sh | ||||
| #    - -c | ||||
| #    image: technosophos/slack-notify | ||||
| #  inputs: | ||||
| #    artifacts: | ||||
| #    - name: metrics | ||||
| #      optional: true | ||||
| #      path: /tmp/metrics.json | ||||
| #    parameters: | ||||
| #    - name: status | ||||
| #  name: slack-notify-success | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       creationTimestamp: null | ||||
|       name: data | ||||
|     spec: | ||||
|       accessModes: | ||||
|         - ReadWriteOnce | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 200Gi | ||||
|   - metadata: | ||||
|       creationTimestamp: null | ||||
|       name: output | ||||
|     spec: | ||||
|       accessModes: | ||||
|         - ReadWriteOnce | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 200Gi | ||||
							
								
								
									
										58
									
								
								db/data/jupyter_lab_20200929153931.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								db/data/jupyter_lab_20200929153931.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| # Docker containers that are part of the Workspace | ||||
| containers: | ||||
|   - name: jupyterlab-tensorflow | ||||
|     image: onepanel/jupyterlab:1.0.1 | ||||
|     command: ["/bin/bash", "-c", "pip install onepanel-sdk && start.sh jupyter lab --LabApp.token='' --LabApp.allow_remote_access=True --LabApp.allow_origin=\"*\" --LabApp.disable_check_xsrf=True --LabApp.trust_xheaders=True --LabApp.base_url=/ --LabApp.tornado_settings='{\"headers\":{\"Content-Security-Policy\":\"frame-ancestors * \'self\'\"}}' --notebook-dir='/data' --allow-root"] | ||||
|     env: | ||||
|       - name: tornado | ||||
|         value: "'{'headers':{'Content-Security-Policy':\"frame-ancestors\ *\ \'self'\"}}'" | ||||
|     args: | ||||
|     ports: | ||||
|       - containerPort: 8888 | ||||
|         name: jupyterlab | ||||
|       - containerPort: 6006 | ||||
|         name: tensorboard | ||||
|     volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /data | ||||
| ports: | ||||
|   - name: jupyterlab | ||||
|     port: 80 | ||||
|     protocol: TCP | ||||
|     targetPort: 8888 | ||||
|   - name: tensorboard | ||||
|     port: 6006 | ||||
|     protocol: TCP | ||||
|     targetPort: 6006 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: /tensorboard | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 6006 | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / #jupyter runs at the default route | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 80 | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  - name: slack-notify | ||||
| #    container: | ||||
| #      image: technosophos/slack-notify | ||||
| #      args: | ||||
| #      - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #      command: | ||||
| #      - sh | ||||
| #      - -c | ||||
							
								
								
									
										41
									
								
								db/data/vscode_20200929144301.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								db/data/vscode_20200929144301.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| # Docker containers that are part of the Workspace | ||||
| containers: | ||||
|   - name: vscode | ||||
|     image: onepanel/vscode:1.0.0 | ||||
|     command: ["/bin/bash", "-c", "pip install onepanel-sdk && /usr/bin/entrypoint.sh --bind-addr 0.0.0.0:8080 --auth none ."] | ||||
|     ports: | ||||
|       - containerPort: 8080 | ||||
|         name: vscode | ||||
|     volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /data | ||||
| ports: | ||||
|   - name: vscode | ||||
|     port: 8080 | ||||
|     protocol: TCP | ||||
|     targetPort: 8080 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / #vscode runs at the default route | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8080 | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  -  name: slack-notify | ||||
| #     container: | ||||
| #       image: technosophos/slack-notify | ||||
| #       args: | ||||
| #       - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #       command: | ||||
| #       - sh | ||||
| #       - -c | ||||
							
								
								
									
										60
									
								
								db/data/vscode_20201028145443.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								db/data/vscode_20201028145443.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| # Docker containers that are part of the Workspace | ||||
| containers: | ||||
|   - name: vscode | ||||
|     image: onepanel/vscode:1.0.0 | ||||
|     command: ["/bin/bash", "-c", "pip install onepanel-sdk && /usr/bin/entrypoint.sh --bind-addr 0.0.0.0:8080 --auth none ."] | ||||
|     ports: | ||||
|       - containerPort: 8080 | ||||
|         name: vscode | ||||
|     volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /data | ||||
|     lifecycle: | ||||
|       postStart: | ||||
|         exec: | ||||
|           command: | ||||
|             - /bin/sh | ||||
|             - -c | ||||
|             - > | ||||
|               condayml="/data/.environment.yml"; | ||||
|               vscodetxt="/data/.vscode-extensions.txt"; | ||||
|               if [ -f "$condayml" ]; then conda env update -f $condayml; fi; | ||||
|               if [ -f "$vscodetxt" ]; then cat $vscodetxt | xargs -n 1 code-server --install-extension; fi; | ||||
|       preStop: | ||||
|         exec: | ||||
|           command: | ||||
|             - /bin/sh | ||||
|             - -c | ||||
|             - > | ||||
|               conda env export > /data/.environment.yml -n base; | ||||
|               code-server --list-extensions | tail -n +2 > /data/.vscode-extensions.txt; | ||||
| ports: | ||||
|   - name: vscode | ||||
|     port: 8080 | ||||
|     protocol: TCP | ||||
|     targetPort: 8080 | ||||
| routes: | ||||
|   - match: | ||||
|       - uri: | ||||
|           prefix: / #vscode runs at the default route | ||||
|     route: | ||||
|       - destination: | ||||
|           port: | ||||
|             number: 8080 | ||||
| # DAG Workflow to be executed once a Workspace action completes (optional) | ||||
| #postExecutionWorkflow: | ||||
| #  entrypoint: main | ||||
| #  templates: | ||||
| #  - name: main | ||||
| #    dag: | ||||
| #       tasks: | ||||
| #       - name: slack-notify | ||||
| #         template: slack-notify | ||||
| #  -  name: slack-notify | ||||
| #     container: | ||||
| #       image: technosophos/slack-notify | ||||
| #       args: | ||||
| #       - SLACK_USERNAME=onepanel SLACK_TITLE="Your workspace is ready" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE="Your workspace is now running" ./slack-notify | ||||
| #       command: | ||||
| #       - sh | ||||
| #       - -c | ||||
| @@ -37,7 +37,7 @@ const maskRCNNWorkflowTemplate = `arguments: | ||||
|   - name: sys-num-classes | ||||
|     displayName: Number of classes | ||||
|     hint: Number of classes (i.e in CVAT taks) + 1 for background | ||||
|     value: 81 | ||||
|     value: '81' | ||||
|     visibility: private | ||||
|      | ||||
|   - name: extras | ||||
| @@ -265,7 +265,7 @@ const tensorflowObjectDetectionWorkflowTemplate = `arguments: | ||||
|     visibility: public | ||||
|      | ||||
|   - name: sys-num-classes | ||||
|     value: 81 | ||||
|     value: '81' | ||||
|     hint: Number of classes | ||||
|     displayName: Number of classes | ||||
|     visibility: private | ||||
|   | ||||
| @@ -105,13 +105,14 @@ func Up20200821162630(tx *sql.Tx) error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		UID:      uid, | ||||
| 		Name:     jupyterLabTemplateName, | ||||
| 		Manifest: jupyterWorkspaceTemplate2, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     jupyterLabTemplateName, | ||||
| 			Manifest: jupyterWorkspaceTemplate2, | ||||
| 		} | ||||
|  | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -35,7 +35,7 @@ const maskRCNNTemplate2 = `arguments: | ||||
|   - name: cvat-num-classes | ||||
|     displayName: Number of classes | ||||
|     hint: Number of classes (i.e in CVAT taks) + 1 for background | ||||
|     value: 81 | ||||
|     value: '81' | ||||
|     visibility: private | ||||
|      | ||||
|   - name: hyperparameters | ||||
|   | ||||
| @@ -73,7 +73,7 @@ const tensorflowObjectDetectionTraining2 = `arguments: | ||||
|     visibility: public | ||||
|      | ||||
|   - name: cvat-num-classes | ||||
|     value: 81 | ||||
|     value: '81' | ||||
|     hint: Number of classes | ||||
|     displayName: Number of classes | ||||
|     visibility: private | ||||
|   | ||||
| @@ -2,7 +2,6 @@ package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
| @@ -102,14 +101,8 @@ func Up20200929153931(tx *sql.Tx) error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		UID:      uid, | ||||
| 		Name:     jupyterLabTemplateName, | ||||
| 		Manifest: jupyterWorkspaceTemplate3, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 		if _, err := client.UpdateWorkspaceTemplateManifest(namespace.Name, uid, jupyterWorkspaceTemplate3); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| @@ -144,14 +137,9 @@ func Down20200929153931(tx *sql.Tx) error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		UID:      uid, | ||||
| 		Name:     jupyterLabTemplateName, | ||||
| 		Manifest: jupyterWorkspaceTemplate2, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 		if _, err := client.UpdateWorkspaceTemplateManifest(namespace.Name, uid, jupyterWorkspaceTemplate2); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										25
									
								
								db/go/20201016170415_update_cvat.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								db/go/20201016170415_update_cvat.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201016170415() { | ||||
| 	if _, ok := initializedMigrations[20201016170415]; !ok { | ||||
| 		goose.AddMigration(Up20201016170415, Down20201016170415) | ||||
| 		initializedMigrations[20201016170415] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20201016170415 updates cvat to a new version | ||||
| func Up20201016170415(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("20201016170415_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
|  | ||||
| // Down20201016170415 does nothing | ||||
| func Down20201016170415(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										26
									
								
								db/go/20201028145442_update_jupyter_lab_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								db/go/20201028145442_update_jupyter_lab_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201028145442() { | ||||
| 	if _, ok := initializedMigrations[20201028145442]; !ok { | ||||
| 		goose.AddMigration(Up20201028145442, Down20201028145442) | ||||
| 		initializedMigrations[20201028145442] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20201028145442 updates the jupyterlab workspace to include container lifecycle hooks. | ||||
| // These hooks will attempt to persist conda, pip, and jupyterlab extensions between pause and shut-down. | ||||
| func Up20201028145442(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("20201028145442_jupyterlab.yaml", jupyterLabTemplateName) | ||||
| } | ||||
|  | ||||
| // Down20201028145442 removes the lifecycle hooks from the template. | ||||
| func Down20201028145442(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										28
									
								
								db/go/20201028145443_update_vscode_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								db/go/20201028145443_update_vscode_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201028145443() { | ||||
| 	if _, ok := initializedMigrations[20201028145443]; !ok { | ||||
| 		goose.AddMigration(Up20201028145443, Down20201028145443) | ||||
| 		initializedMigrations[20201028145443] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20201028145443 migration will add lifecycle hooks to VSCode template. | ||||
| // These hooks will attempt to export the conda, pip, and vscode packages that are installed, | ||||
| // to a text file. | ||||
| // On workspace resume / start, the code then tries to install these packages. | ||||
| func Up20201028145443(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("vscode_20201028145443.yaml", vscodeWorkspaceTemplateName) | ||||
| } | ||||
|  | ||||
| // Down20201028145443 removes the lifecycle hooks from VSCode workspace template. | ||||
| func Down20201028145443(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return updateWorkspaceTemplateManifest("vscode_20201028145443.yaml", vscodeWorkspaceTemplateName) | ||||
| } | ||||
| @@ -0,0 +1,26 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201031165106() { | ||||
| 	if _, ok := initializedMigrations[20201031165106]; !ok { | ||||
| 		goose.AddMigration(Up20201031165106, Down20201031165106) | ||||
| 		initializedMigrations[20201031165106] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20201031165106 updates the jupyterlab workspace to include container lifecycle hooks. | ||||
| // These hooks will attempt to persist conda, pip, and jupyterlab extensions between pause and shut-down. | ||||
| func Up20201031165106(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("20201031165106_jupyterlab.yaml", jupyterLabTemplateName) | ||||
| } | ||||
|  | ||||
| // Down20201031165106 removes the lifecycle hooks from the template. | ||||
| func Down20201031165106(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return updateWorkspaceTemplateManifest("20201028145442_jupyterlab.yaml", jupyterLabTemplateName) | ||||
| } | ||||
							
								
								
									
										27
									
								
								db/go/20201102104048_update_cvat_reduce_vols.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								db/go/20201102104048_update_cvat_reduce_vols.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201102104048() { | ||||
| 	if _, ok := initializedMigrations[20201102104048]; !ok { | ||||
| 		goose.AddMigration(Up20201102104048, Down20201102104048) | ||||
| 		initializedMigrations[20201102104048] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20201102104048 updates CVAT to use less volumes. | ||||
| // Through the use of environment variables, various CVAT data directories | ||||
| // are placed under one path, and that path is on one volume. | ||||
| func Up20201102104048(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("20201102104048_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
|  | ||||
| // Down20201102104048 reverts CVAT back to original amount of volumes. | ||||
| func Down20201102104048(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return updateWorkspaceTemplateManifest("20201016170415_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
							
								
								
									
										26
									
								
								db/go/20201113094916_update_cvat_onepanel_sdk.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								db/go/20201113094916_update_cvat_onepanel_sdk.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201113094916() { | ||||
| 	if _, ok := initializedMigrations[20201113094916]; !ok { | ||||
| 		goose.AddMigration(Up20201113094916, Down20201113094916) | ||||
| 		initializedMigrations[20201113094916] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //Up20201113094916 updates CVAT with python-sdk 0.15.0 | ||||
| //Of note, this replaces the authentication request endpoint. | ||||
| func Up20201113094916(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("20201113094916_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
|  | ||||
| //Down20201113094916 updates CVAT back to previous python-sdk version of 0.14.0 | ||||
| func Down20201113094916(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return updateWorkspaceTemplateManifest("20201102104048_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
							
								
								
									
										25
									
								
								db/go/20201115133046_update_cvat_env_vars.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								db/go/20201115133046_update_cvat_env_vars.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201115133046() { | ||||
| 	if _, ok := initializedMigrations[20201115133046]; !ok { | ||||
| 		goose.AddMigration(Up20201115133046, Down20201115133046) | ||||
| 		initializedMigrations[20201115133046] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //Up20201115133046 updates CVAT environment variables | ||||
| func Up20201115133046(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkspaceTemplateManifest("20201115133046_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
|  | ||||
| //Down20201115133046 reverts latest environment variable updates | ||||
| func Down20201115133046(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return updateWorkspaceTemplateManifest("20201113094916_cvat.yaml", cvatTemplateName) | ||||
| } | ||||
							
								
								
									
										31
									
								
								db/go/20201115134934_add_tensorboard_to_tfod.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								db/go/20201115134934_add_tensorboard_to_tfod.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201115134934() { | ||||
| 	if _, ok := initializedMigrations[20201115134934]; !ok { | ||||
| 		goose.AddMigration(Up20201115134934, Down20201115134934) | ||||
| 		initializedMigrations[20201115134934] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //Up20201115134934 add TensorBoard sidecar to TFODs | ||||
| func Up20201115134934(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkflowTemplateManifest( | ||||
| 		"20201115134934_tfod.yaml", | ||||
| 		tensorflowObjectDetectionWorkflowTemplateName, | ||||
| 		map[string]string{ | ||||
| 			"used-by": "cvat", | ||||
| 		}, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| //Down20201115134934 do nothing | ||||
| func Down20201115134934(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										31
									
								
								db/go/20201115145814_add_tensorboard_to_maskrcnn.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								db/go/20201115145814_add_tensorboard_to_maskrcnn.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20201115145814() { | ||||
| 	if _, ok := initializedMigrations[20201115145814]; !ok { | ||||
| 		goose.AddMigration(Up20201115145814, Down20201115145814) | ||||
| 		initializedMigrations[20201115145814] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //Up20201115145814 add TensorBoard sidecar to TFODs | ||||
| func Up20201115145814(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	return updateWorkflowTemplateManifest( | ||||
| 		"20201115145814_maskrcnn.yaml", | ||||
| 		maskRCNNWorkflowTemplateName, | ||||
| 		map[string]string{ | ||||
| 			"used-by": "cvat", | ||||
| 		}, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| //Down20201115145814 do nothing | ||||
| func Down20201115145814(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										26
									
								
								db/go/db.go
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								db/go/db.go
									
									
									
									
									
								
							| @@ -5,7 +5,10 @@ import ( | ||||
| 	sq "github.com/Masterminds/squirrel" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| @@ -60,6 +63,15 @@ func Initialize() { | ||||
| 	initialize20200929144301() | ||||
| 	initialize20200929153931() | ||||
| 	initialize20201001070806() | ||||
| 	initialize20201016170415() | ||||
| 	initialize20201028145442() | ||||
| 	initialize20201028145443() | ||||
| 	initialize20201031165106() | ||||
| 	initialize20201102104048() | ||||
| 	initialize20201113094916() | ||||
| 	initialize20201115133046() | ||||
| 	initialize20201115134934() | ||||
| 	initialize20201115145814() | ||||
|  | ||||
| 	if err := client.DB.Close(); err != nil { | ||||
| 		log.Printf("[error] closing db %v", err) | ||||
| @@ -128,3 +140,17 @@ func ReplaceArtifactRepositoryType(client *v1.Client, namespace *v1.Namespace, w | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // readDataFile returns the contents of a file in the db/data/{name} directory | ||||
| func readDataFile(name string) (string, error) { | ||||
| 	curDir, err := os.Getwd() | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	data, err := ioutil.ReadFile(filepath.Join(curDir, "db", "data", name)) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return string(data), nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										94
									
								
								db/go/util.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								db/go/util.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| ) | ||||
|  | ||||
| // updateWorkspaceTemplateManifest will update the workspace template given by {{templateName}} with the contents | ||||
| // given by {{filename}} | ||||
| // It will do so for all namespaces. | ||||
| func updateWorkspaceTemplateManifest(filename, templateName string) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	newManifest, err := readDataFile(filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(templateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     templateName, | ||||
| 			Manifest: newManifest, | ||||
| 		} | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, nil, workspaceTemplate) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.UpdateWorkspaceTemplateManifest(namespace.Name, uid, workspaceTemplate.Manifest); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // updateWorkflowTemplateManifest will update the workflow template given by {{templateName}} with the contents | ||||
| // given by {{filename}} | ||||
| // It will do so for all namespaces. | ||||
| func updateWorkflowTemplateManifest(filename, templateName string, labels map[string]string) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	newManifest, err := readDataFile(filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(templateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workflowTemplate := &v1.WorkflowTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     templateName, | ||||
| 			Manifest: newManifest, | ||||
| 			Labels:   labels, | ||||
| 		} | ||||
|  | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.CreateWorkflowTemplateVersion(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										24
									
								
								db/sql/20201023121927_fix_null_labels.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								db/sql/20201023121927_fix_null_labels.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| -- +goose Up | ||||
| -- SQL in this section is executed when the migration is applied. | ||||
| UPDATE workflow_executions | ||||
| SET labels = '{}'::jsonb | ||||
| WHERE labels = 'null'::jsonb; | ||||
|  | ||||
| UPDATE workflow_templates | ||||
| SET labels = '{}'::jsonb | ||||
| WHERE labels = 'null'::jsonb; | ||||
|  | ||||
| UPDATE workspace_templates | ||||
| SET labels = '{}'::jsonb | ||||
| WHERE labels = 'null'::jsonb; | ||||
|  | ||||
| UPDATE workflow_template_versions | ||||
| SET labels = '{}'::jsonb | ||||
| WHERE labels = 'null'::jsonb; | ||||
|  | ||||
| UPDATE workspace_template_Versions | ||||
| SET labels = '{}'::jsonb | ||||
| WHERE labels = 'null'::jsonb; | ||||
|  | ||||
| -- +goose Down | ||||
| -- SQL in this section is executed when the migration is rolled back. | ||||
							
								
								
									
										9
									
								
								db/sql/20201116105825_add_metrics_to_workflows.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								db/sql/20201116105825_add_metrics_to_workflows.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| -- +goose Up | ||||
| -- SQL in this section is executed when the migration is applied. | ||||
| ALTER TABLE workflow_executions ADD COLUMN metrics JSONB; | ||||
| UPDATE workflow_executions SET metrics = '{}'::JSONB; | ||||
| ALTER TABLE workflow_executions ALTER COLUMN metrics SET NOT NULL; | ||||
|  | ||||
| -- +goose Down | ||||
| -- SQL in this section is executed when the migration is rolled back. | ||||
| ALTER TABLE workflow_executions DROP COLUMN metrics; | ||||
							
								
								
									
										9
									
								
								db/sql/20201118200215_fix_default_migration.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								db/sql/20201118200215_fix_default_migration.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| -- +goose Up | ||||
| -- SQL in this section is executed when the migration is applied. | ||||
| UPDATE workflow_executions SET metrics = '[]'::JSONB | ||||
| WHERE metrics = '{}'::JSONB; | ||||
|  | ||||
| -- +goose Down | ||||
| -- SQL in this section is executed when the migration is rolled back. | ||||
| UPDATE workflow_executions SET metrics = '{}'::JSONB | ||||
| WHERE metrics = '[]'::JSONB; | ||||
| @@ -0,0 +1,46 @@ | ||||
| # Background | ||||
| A user may install pip packages, conda packages, jupyterlab extensions, | ||||
| or vscode extensions. | ||||
|  | ||||
| To improve the user experience, we should save these packages | ||||
| when the user pauses and resumes the workspace. | ||||
| - And when the user changes the workspace machine. | ||||
|  | ||||
| To achieve this end, we’re using lifecycle hooks for containers, via Kubernetes. | ||||
|  | ||||
| We’ll add these hooks to workspace templates, to VSCode and JupyterLab. | ||||
|  | ||||
| Note: We're not supporting CVAT Workspace persistence. | ||||
| - User does not have access to the terminal through the UI. | ||||
|  | ||||
| # Problem(s) | ||||
| Originally, we attempted to tar up the packages of conda, vscode, and jupyter. | ||||
| This worked, but ate non-trivial amount of space. Roughly ~2 GB with a clean workspace, | ||||
| using our dockerfile image. | ||||
| - So we'd need to warn the user to have enough space for their volume mounts | ||||
| - We'd also have to warn the user that if there is not enough space, the packages | ||||
| may not persist. | ||||
|  | ||||
| The other problem was we needed to extend the terminationGracePeriodSeconds of the | ||||
| pod. | ||||
| - K8s sets 30 seconds by default | ||||
|  | ||||
| We use the preStop hook to do the back-up. | ||||
| - This operation runs for 2-3 minutes on a clean workspace image | ||||
| - For a user with more packages, it would take longer. | ||||
| - k8s will grant a 2 second increase once, if preStop is not done. | ||||
|  | ||||
| Otherwise, k8s kills the preStop hook and the container. | ||||
|  | ||||
| We thought about exposing the terminationGracePeriodSeconds to the user, | ||||
| allow them to change this value as needed. | ||||
|  | ||||
| And lastly, k8s will wait the entire grace period. | ||||
| - Even if the preStop hook finishes early, k8s will wait to kill the container. | ||||
| - In testing, k8s waited 20 minutes before terminating the container | ||||
|  | ||||
| So we decided to export the list of installed packages, as a text file. | ||||
| - Then, we re-install on workspace start-up with postStart hook. | ||||
|  | ||||
| # References | ||||
| - https://github.com/onepanelio/core/issues/623 | ||||
							
								
								
									
										40
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								go.mod
									
									
									
									
									
								
							| @@ -3,21 +3,23 @@ module github.com/onepanelio/core | ||||
| go 1.14 | ||||
|  | ||||
| require ( | ||||
| 	github.com/Azure/go-autorest v14.0.0+incompatible // indirect | ||||
| 	cloud.google.com/go/storage v1.6.0 | ||||
| 	github.com/Azure/go-autorest v14.0.0+incompatible // indirect | ||||
| 	github.com/Azure/go-autorest/autorest/adal v0.8.2 // indirect | ||||
| 	github.com/Masterminds/squirrel v1.1.0 | ||||
| 	github.com/argoproj/argo v0.0.0-20200331233432-4d1175eb68f6 | ||||
| 	github.com/argoproj/pkg v0.0.0-20200318225345-d3be5f29b1a8 | ||||
| 	github.com/argoproj/argo v0.0.0-20201001162359-6f738db0733d | ||||
| 	github.com/argoproj/pkg v0.1.0 | ||||
| 	github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 | ||||
| 	github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||||
| 	github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect | ||||
| 	github.com/evanphx/json-patch v4.5.0+incompatible // indirect | ||||
| 	github.com/ghodss/yaml v1.0.0 | ||||
| 	github.com/go-sql-driver/mysql v1.5.0 // indirect | ||||
| 	github.com/golang/protobuf v1.4.1 | ||||
| 	github.com/golang/protobuf v1.4.2 | ||||
| 	github.com/google/uuid v1.1.1 | ||||
| 	github.com/gorilla/handlers v1.4.2 | ||||
| 	github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 | ||||
| 	github.com/grpc-ecosystem/grpc-gateway v1.14.4 | ||||
| 	github.com/grpc-ecosystem/grpc-gateway v1.14.6 | ||||
| 	github.com/hashicorp/go-uuid v1.0.2 // indirect | ||||
| 	github.com/hashicorp/golang-lru v0.5.4 // indirect | ||||
| 	github.com/jmoiron/sqlx v1.2.0 | ||||
| @@ -26,21 +28,27 @@ require ( | ||||
| 	github.com/minio/minio-go/v6 v6.0.45 | ||||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/pressly/goose v2.6.0+incompatible | ||||
| 	github.com/sirupsen/logrus v1.4.2 | ||||
| 	github.com/spf13/cobra v0.0.5 // indirect | ||||
| 	github.com/stretchr/testify v1.4.0 | ||||
| 	github.com/sirupsen/logrus v1.6.0 | ||||
| 	github.com/stretchr/testify v1.6.1 | ||||
| 	github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc | ||||
| 	golang.org/x/net v0.0.0-20200301022130-244492dfa37a | ||||
| 	golang.org/x/net v0.0.0-20200602114024-627f9648deb9 | ||||
| 	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d | ||||
| 	google.golang.org/api v0.20.0 | ||||
| 	google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84 | ||||
| 	google.golang.org/grpc v1.28.0 | ||||
| 	google.golang.org/protobuf v1.22.0 | ||||
| 	google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 | ||||
| 	google.golang.org/grpc v1.29.1 | ||||
| 	google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc | ||||
| 	gopkg.in/yaml.v2 v2.2.8 | ||||
| 	gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 | ||||
| 	istio.io/api v0.0.0-20200107183329-ed4b507c54e1 | ||||
| 	k8s.io/api v0.16.4 | ||||
| 	k8s.io/apimachinery v0.16.7-beta.0 | ||||
| 	k8s.io/client-go v0.16.4 | ||||
| 	k8s.io/api v0.18.2 | ||||
| 	k8s.io/apimachinery v0.18.2 | ||||
| 	k8s.io/client-go v0.18.2 | ||||
| 	sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e // indirect | ||||
| 	sigs.k8s.io/yaml v1.2.0 | ||||
| ) | ||||
| ) | ||||
|  | ||||
| replace ( | ||||
| 	k8s.io/api => k8s.io/api v0.17.8 | ||||
| 	k8s.io/apimachinery => k8s.io/apimachinery v0.17.8 | ||||
| 	k8s.io/client-go => k8s.io/client-go v0.17.8 | ||||
| ) | ||||
|   | ||||
							
								
								
									
										375
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										375
									
								
								go.sum
									
									
									
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| bou.ke/staticfiles v0.0.0-20190225145250-827d7f6389cd/go.mod h1:JpKWzdMX3ZBe8DYU+jWnZyYT4tJR9pMee/kPGvap41o= | ||||
| 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= | ||||
| @@ -26,6 +27,7 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo | ||||
| cloud.google.com/go/storage v1.6.0 h1:UDpwYIwla4jHGzZJaEJYx1tOejbgSoNqsAfHAUYe2r8= | ||||
| cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= | ||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | ||||
| github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= | ||||
| github.com/Azure/go-autorest v11.1.2+incompatible h1:viZ3tV5l4gE2Sw0xrasFHytCGtzYCrT+um/rrSQ1BfA= | ||||
| github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= | ||||
| github.com/Azure/go-autorest v14.0.0+incompatible h1:r/ug62X9o8vikt53/nkAPmFmzfSrCCAplPH7wa+mK0U= | ||||
| @@ -49,16 +51,20 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| 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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= | ||||
| github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= | ||||
| github.com/Masterminds/squirrel v1.1.0 h1:baP1qLdoQCeTw3ifCdOq2dkYc6vGcmRdaociKLbEJXs= | ||||
| github.com/Masterminds/squirrel v1.1.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA= | ||||
| github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= | ||||
| github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | ||||
| github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | ||||
| github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | ||||
| github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= | ||||
| github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | ||||
| github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= | ||||
| github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= | ||||
| github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= | ||||
| github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= | ||||
| github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= | ||||
| github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= | ||||
| github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= | ||||
| @@ -66,47 +72,83 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy | ||||
| github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | ||||
| github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | ||||
| github.com/aliyun/aliyun-oss-go-sdk v2.0.6+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= | ||||
| github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= | ||||
| github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | ||||
| github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= | ||||
| github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= | ||||
| github.com/antonmedv/expr v1.8.2/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= | ||||
| github.com/argoproj/argo v0.0.0-20200331233432-4d1175eb68f6 h1:461HWTh6d9fbXX9CWR98Nv/3z70/YgtbQCMiZPKHNa8= | ||||
| github.com/argoproj/argo v0.0.0-20200331233432-4d1175eb68f6/go.mod h1:EPALpXM4ZpKFbQmKn722bvQUiirWNIsNe1MgmTltZkI= | ||||
| github.com/argoproj/argo v0.0.0-20201001162359-6f738db0733d h1:COfGhXvHFTSK4rDukuG5upwjrarf0FH4onjdyaS4wmg= | ||||
| github.com/argoproj/argo v0.0.0-20201001162359-6f738db0733d/go.mod h1:w8Qx0tlO5/sQJK+KZ22i0RfhSf9MCdDX3oB11eS5/fE= | ||||
| github.com/argoproj/pkg v0.0.0-20200318225345-d3be5f29b1a8 h1:RMfnXz1F/mOr2bBwMpShDH+HlWf7MWisDmxNZmoWH2s= | ||||
| github.com/argoproj/pkg v0.0.0-20200318225345-d3be5f29b1a8/go.mod h1:2EZ44RG/CcgtPTwrRR0apOc7oU6UIw8GjCUJWZ8X3bM= | ||||
| github.com/argoproj/pkg v0.1.0 h1:JRgyisq1qByfl4EEuaJgYSMxMnNENjgj/U3FEfEJxLM= | ||||
| github.com/argoproj/pkg v0.1.0/go.mod h1:3mBVZkOKuRChHVdLt76H7y0MLuKJ8ag8LjLxB/evmnM= | ||||
| github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= | ||||
| github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= | ||||
| github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | ||||
| github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | ||||
| github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | ||||
| github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= | ||||
| github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | ||||
| github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= | ||||
| github.com/aws/aws-sdk-go v1.33.16/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= | ||||
| github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= | ||||
| github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= | ||||
| github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= | ||||
| github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= | ||||
| github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= | ||||
| github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= | ||||
| github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= | ||||
| 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/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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= | ||||
| github.com/colinmarc/hdfs v1.1.4-0.20180805212432-9746310a4d31 h1:ow7T77012NSZVW0uOWoQxz3yj9fHKYeZ4QmNrMtWMbM= | ||||
| github.com/colinmarc/hdfs v1.1.4-0.20180805212432-9746310a4d31/go.mod h1:vSBumefK4HA5uiRSwNP+3ofgrEoScpCS2MMWcWXEuQ4= | ||||
| github.com/corbym/gocrest v1.0.3/go.mod h1:maVFL5lbdS2PgfOQgGRWDYTeunSWQeiEgoNdTABShCs= | ||||
| github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= | ||||
| github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | ||||
| github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | ||||
| github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= | ||||
| github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= | ||||
| github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= | ||||
| github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | ||||
| github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | ||||
| github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | ||||
| github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= | ||||
| github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= | ||||
| github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | ||||
| github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | ||||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | ||||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | ||||
| github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= | ||||
| github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | ||||
| github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= | ||||
| github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s= | ||||
| github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= | ||||
| github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= | ||||
| github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= | ||||
| github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= | ||||
| github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= | ||||
| github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= | ||||
| github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 h1:pEtiCjIXx3RvGjlUJuCNxNOw0MNblyR9Wi+vJGBFh+8= | ||||
| github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= | ||||
| github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= | ||||
| @@ -124,42 +166,132 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi | ||||
| github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= | ||||
| github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= | ||||
| github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= | ||||
| github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= | ||||
| github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= | ||||
| github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= | ||||
| github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= | ||||
| github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | ||||
| github.com/gavv/httpexpect/v2 v2.0.3/go.mod h1:LAoDcy8I/EXEtKJV6wMEJvOMAZVo0MfEk5u4NfiNQa4= | ||||
| github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= | ||||
| github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= | ||||
| github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= | ||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | ||||
| github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | ||||
| github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | ||||
| github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= | ||||
| github.com/go-ini/ini v1.51.1/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= | ||||
| github.com/go-ini/ini v1.57.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= | ||||
| github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= | ||||
| github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= | ||||
| github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= | ||||
| github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= | ||||
| github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= | ||||
| github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= | ||||
| github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= | ||||
| github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= | ||||
| github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | ||||
| github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | ||||
| github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= | ||||
| github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= | ||||
| github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | ||||
| github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | ||||
| github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | ||||
| github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | ||||
| github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | ||||
| github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= | ||||
| github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= | ||||
| github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | ||||
| github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | ||||
| github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | ||||
| github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= | ||||
| github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | ||||
| github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= | ||||
| github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | ||||
| github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | ||||
| github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= | ||||
| github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= | ||||
| github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= | ||||
| github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= | ||||
| github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | ||||
| github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | ||||
| github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | ||||
| github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= | ||||
| github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= | ||||
| github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= | ||||
| github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= | ||||
| github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= | ||||
| github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= | ||||
| github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= | ||||
| github.com/go-openapi/runtime v0.19.12/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= | ||||
| github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= | ||||
| github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | ||||
| github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | ||||
| github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= | ||||
| github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= | ||||
| github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= | ||||
| github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | ||||
| github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | ||||
| github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= | ||||
| github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | ||||
| github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | ||||
| github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | ||||
| github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= | ||||
| github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | ||||
| github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | ||||
| github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | ||||
| github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | ||||
| github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= | ||||
| github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | ||||
| github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | ||||
| github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | ||||
| github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= | ||||
| github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | ||||
| github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | ||||
| github.com/go-openapi/swag v0.19.8 h1:vfK6jLhs7OI4tAXkvkooviaE1JEPcw3mutyegLHHjmk= | ||||
| github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | ||||
| github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= | ||||
| github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= | ||||
| github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | ||||
| github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= | ||||
| github.com/go-openapi/validate v0.19.7/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= | ||||
| github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | ||||
| github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | ||||
| github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= | ||||
| github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | ||||
| github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | ||||
| github.com/go-swagger/go-swagger v0.23.0/go.mod h1:5AaV4Dx69cUjpFRTZnSHPr1Y7dKBVk6SvfIvkTEqwJs= | ||||
| github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= | ||||
| github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= | ||||
| github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | ||||
| github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | ||||
| github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | ||||
| github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | ||||
| github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= | ||||
| github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | ||||
| github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | ||||
| github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= | ||||
| github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= | ||||
| github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= | ||||
| github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= | ||||
| github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= | ||||
| github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= | ||||
| github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= | ||||
| github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= | ||||
| github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= | ||||
| github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= | ||||
| github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | ||||
| github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | ||||
| github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | ||||
| github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | ||||
| github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= | ||||
| github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= | ||||
| github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= | ||||
| github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= | ||||
| @@ -170,6 +302,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= | ||||
| @@ -196,6 +329,9 @@ github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ | ||||
| github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | ||||
| github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= | ||||
| github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= | ||||
| github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= | ||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| @@ -210,6 +346,8 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN | ||||
| github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= | ||||
| github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= | ||||
| github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= | ||||
| github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= | ||||
| github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | ||||
| @@ -221,10 +359,14 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 | ||||
| github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= | ||||
| github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | ||||
| github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= | ||||
| github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | ||||
| github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||
| github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= | ||||
| github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||
| github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= | ||||
| github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= | ||||
| github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= | ||||
| @@ -235,15 +377,28 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= | ||||
| github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= | ||||
| github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||
| github.com/gorilla/websocket v1.0.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||
| github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||
| github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= | ||||
| github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= | ||||
| github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= | ||||
| github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= | ||||
| github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.14.4 h1:IOPK2xMPP3aV6/NPt4jt//ELFo3Vv8sDVD8j3+tleDU= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= | ||||
| github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | ||||
| github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | ||||
| github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= | ||||
| @@ -260,6 +415,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: | ||||
| github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= | ||||
| github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= | ||||
| github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= | ||||
| github.com/imkira/go-interpol v1.0.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= | ||||
| github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= | ||||
| github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= | ||||
| github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | ||||
| @@ -269,14 +425,20 @@ github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem | ||||
| github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= | ||||
| github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||
| github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= | ||||
| github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= | ||||
| github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= | ||||
| github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | ||||
| github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | ||||
| github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||
| github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||
| github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= | ||||
| github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||
| github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= | ||||
| github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||
| github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= | ||||
| github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= | ||||
| github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= | ||||
| @@ -284,14 +446,21 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 | ||||
| github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= | ||||
| github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= | ||||
| github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= | ||||
| github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= | ||||
| github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= | ||||
| github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= | ||||
| github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | ||||
| github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | ||||
| github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | ||||
| github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | ||||
| github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= | ||||
| @@ -301,6 +470,7 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= | ||||
| github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= | ||||
| github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= | ||||
| github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= | ||||
| github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= | ||||
| @@ -308,21 +478,42 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm | ||||
| github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= | ||||
| github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= | ||||
| github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= | ||||
| github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | ||||
| github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | ||||
| github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= | ||||
| github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | ||||
| github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= | ||||
| github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | ||||
| github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= | ||||
| github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= | ||||
| github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||
| github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | ||||
| github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | ||||
| github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= | ||||
| github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
| github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
| github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | ||||
| github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | ||||
| github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= | ||||
| github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | ||||
| github.com/mattn/goreman v0.3.5/go.mod h1:ahZuLhEo4pfYmf56GLNu/pjTxfeE389h43IHKMXz2Ys= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= | ||||
| github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= | ||||
| github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o= | ||||
| github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8= | ||||
| github.com/minio/minio-go/v6 v6.0.45 h1:aY4NI/DOgSbZiwGN3fEF4NAkC9An4bhaIWuJrQrRYew= | ||||
| github.com/minio/minio-go/v6 v6.0.45/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= | ||||
| github.com/minio/minio-go/v7 v7.0.2/go.mod h1:dJ80Mv2HeGkYLH1sqS/ksz07ON6csH3S6JUMSQ2zAns= | ||||
| github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= | ||||
| github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= | ||||
| github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= | ||||
| @@ -336,22 +527,33 @@ github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lN | ||||
| github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||
| github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= | ||||
| github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||
| github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | ||||
| github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= | ||||
| github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= | ||||
| github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
| github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= | ||||
| github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= | ||||
| github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= | ||||
| github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= | ||||
| github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | ||||
| github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= | ||||
| github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= | ||||
| github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | ||||
| github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= | ||||
| github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | ||||
| github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= | ||||
| github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= | ||||
| github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= | ||||
| github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= | ||||
| github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= | ||||
| github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| @@ -360,32 +562,59 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE | ||||
| github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= | ||||
| github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= | ||||
| github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= | ||||
| github.com/pressly/goose v2.6.0+incompatible h1:3f8zIQ8rfgP9tyI0Hmcs2YNAqUCL1c+diLe3iU8Qd/k= | ||||
| github.com/pressly/goose v2.6.0+incompatible/go.mod h1:m+QHWCqxR3k8D9l7qfzuC/djtlfzxr34mozWDYEu1z8= | ||||
| github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= | ||||
| github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= | ||||
| github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= | ||||
| github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | ||||
| github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= | ||||
| github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= | ||||
| github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= | ||||
| github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= | ||||
| github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= | ||||
| github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= | ||||
| github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= | ||||
| github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= | ||||
| github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= | ||||
| github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | ||||
| github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= | ||||
| github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= | ||||
| github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= | ||||
| github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= | ||||
| github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= | ||||
| github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | ||||
| github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= | ||||
| github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | ||||
| github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||
| github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= | ||||
| github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | ||||
| github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | ||||
| github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= | ||||
| github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | ||||
| github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | ||||
| github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | ||||
| github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | ||||
| github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= | ||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||
| github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= | ||||
| github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | ||||
| github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| @@ -393,56 +622,91 @@ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:s | ||||
| github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= | ||||
| github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | ||||
| github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | ||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | ||||
| github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= | ||||
| github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||
| github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||
| github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | ||||
| github.com/spf13/cobra v0.0.4-0.20181021141114-fe5e611709b0/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | ||||
| github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= | ||||
| github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= | ||||
| github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= | ||||
| github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= | ||||
| github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | ||||
| github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= | ||||
| github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||
| github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||
| github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||
| github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= | ||||
| github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= | ||||
| github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= | ||||
| github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | ||||
| github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | ||||
| 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 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= | ||||
| github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= | ||||
| github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= | ||||
| github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= | ||||
| github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= | ||||
| github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo= | ||||
| github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= | ||||
| github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= | ||||
| github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= | ||||
| github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= | ||||
| github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= | ||||
| github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= | ||||
| github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | ||||
| github.com/valyala/fasthttp v0.0.0-20171207120941-e5f51c11919d/go.mod h1:+g/po7GqyG5E+1CNgquiIxJnsXEi5vwFn5weFujbO78= | ||||
| github.com/valyala/fasthttp v1.0.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= | ||||
| github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= | ||||
| github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= | ||||
| github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= | ||||
| github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= | ||||
| github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= | ||||
| github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= | ||||
| github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= | ||||
| github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= | ||||
| github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= | ||||
| github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= | ||||
| github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= | ||||
| github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= | ||||
| github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= | ||||
| github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= | ||||
| github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= | ||||
| github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= | ||||
| github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= | ||||
| github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= | ||||
| github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= | ||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||
| go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||
| go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= | ||||
| go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | ||||
| go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | ||||
| go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | ||||
| go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | ||||
| go.mongodb.org/mongo-driver v1.3.1/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | ||||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= | ||||
| go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||
| go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||
| @@ -453,18 +717,28 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf | ||||
| golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | ||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U= | ||||
| golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= | ||||
| golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | ||||
| golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | ||||
| golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= | ||||
| golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= | ||||
| @@ -498,10 +772,14 @@ golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73r | ||||
| 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-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| @@ -511,6 +789,8 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| @@ -521,6 +801,8 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL | ||||
| 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 h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= | ||||
| golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= | ||||
| golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | ||||
| 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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| @@ -532,6 +814,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ | ||||
| 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-20190412183630-56d357773e84/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 h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= | ||||
| @@ -540,6 +823,7 @@ golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5h | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| @@ -547,16 +831,25 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h | ||||
| golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/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= | ||||
| @@ -565,8 +858,11 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| 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-20200317113312-5766fd39f98d h1:62ap6LNOjDU6uGmKXHJbSfciMoV+FeI1sRXx/pLDL44= | ||||
| golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= | ||||
| golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| @@ -575,6 +871,7 @@ golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5f | ||||
| golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | ||||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||
| golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= | ||||
| @@ -584,21 +881,29 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm | ||||
| golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190420181800-aa740d480789/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-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20190617190820-da514acc4774/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-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= | ||||
| 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-20190920225731-5eefd052ad72/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= | ||||
| @@ -615,13 +920,18 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK | ||||
| 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-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||
| golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||
| golang.org/x/tools v0.0.0-20200331202046-9d5940d49312 h1:2PHG+Ia3gK1K2kjxZnSylizb//eyaMG8gDFbOG7wLV8= | ||||
| golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= | ||||
| gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= | ||||
| gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= | ||||
| 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= | ||||
| @@ -660,8 +970,12 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG | ||||
| google.golang.org/genproto v0.0.0-20200317114155-1f3552e48f24/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84 h1:pSLkPbrjnPyLDYUO2VM9mDLqo2V6CFBY84lFSZAfoi4= | ||||
| google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= | ||||
| google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= | ||||
| google.golang.org/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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | ||||
| 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.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| @@ -672,6 +986,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 | ||||
| google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | ||||
| google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= | ||||
| google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= | ||||
| google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= | ||||
| google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= | ||||
| 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= | ||||
| @@ -680,21 +996,30 @@ google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zim | ||||
| google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | ||||
| google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY= | ||||
| 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 h1:TnonUr8u3himcMY0vSh23jFOXA+cnucl1gB6EQTReBI= | ||||
| google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= | ||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= | ||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||
| gopkg.in/gavv/httpexpect.v2 v2.0.0/go.mod h1:uMEAayJd5rI8SqPSUiHbQFyj5OTNrBgkLUYex48OYGc= | ||||
| gopkg.in/go-playground/webhooks.v5 v5.15.0/go.mod h1:LZbya/qLVdbqDR1aKrGuWV6qbia2zCYSR5dpom2SInQ= | ||||
| gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||
| gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= | ||||
| gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||
| gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/ini.v1 v1.52.0 h1:j+Lt/M1oPPejkniCg1TkWE2J3Eh1oZTsHSXzMTzUXn4= | ||||
| gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/ini.v1 v1.54.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= | ||||
| gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= | ||||
| gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= | ||||
| gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= | ||||
| @@ -706,12 +1031,18 @@ gopkg.in/jcmturner/gokrb5.v5 v5.3.0/go.mod h1:oQz8Wc5GsctOTgCVyKad1Vw4TCWz5G6gfI | ||||
| gopkg.in/jcmturner/rpc.v0 v0.0.2 h1:wBTgrbL1qmLBUPsYVCqdJiI5aJgQhexmK+JkTHPUNJI= | ||||
| gopkg.in/jcmturner/rpc.v0 v0.0.2/go.mod h1:NzMq6cRzR9lipgw7WxRBHNx5N8SifBuaCQsOT1kWY/E= | ||||
| gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= | ||||
| gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= | ||||
| gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= | ||||
| gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= | ||||
| gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= | ||||
| gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= | ||||
| gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= | ||||
| gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= | ||||
| gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||||
| gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= | ||||
| gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= | ||||
| gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| @@ -719,8 +1050,11 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | ||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | ||||
| gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= | ||||
| 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= | ||||
| @@ -736,15 +1070,34 @@ k8s.io/api v0.0.0-20191004120003-3a12735a829a/go.mod h1:ceHJE/vDjU8jKnRV6Vqn/+vy | ||||
| k8s.io/api v0.0.0-20191219150132-17cfeff5d095/go.mod h1:VTIBWh+oVNX3+w6a85XIJE6jGsm0GCZKZmRQ6cdjfyA= | ||||
| k8s.io/api v0.16.4 h1:O06Ed/hgLiCrzW1SHp6HAhqcTnYHtK80bP5rXoHakpM= | ||||
| k8s.io/api v0.16.4/go.mod h1:AtzMnsR45tccQss5q8RnF+W8L81DH6XwXwo/joEx9u0= | ||||
| k8s.io/api v0.17.8 h1:8JHlbqJ3A6sGhoacXfu/sASSD+HWWqVq67qt9lyB0kU= | ||||
| k8s.io/api v0.17.8/go.mod h1:N++Llhs8kCixMUoCaXXAyMMPbo8dDVnh+IQ36xZV2/0= | ||||
| k8s.io/api v0.18.2 h1:wG5g5ZmSVgm5B+eHMIbI9EGATS2L8Z72rda19RIEgY8= | ||||
| k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= | ||||
| k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= | ||||
| k8s.io/apimachinery v0.0.0-20191004115701-31ade1b30762/go.mod h1:Xc10RHc1U+F/e9GCloJ8QAeCGevSVP5xhOhqlE+e1kM= | ||||
| k8s.io/apimachinery v0.0.0-20191219145857-f69eda767ee8/go.mod h1:mhhO3hoLkWO+2eCvqjPtH2Ly92l9nJDwsswzWKpkN2w= | ||||
| k8s.io/apimachinery v0.16.4/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= | ||||
| k8s.io/apimachinery v0.16.7-beta.0 h1:1cNiN7ZXJzlWq7dnWojG5UcrX1AIfQqpbyuzhu7Bhsc= | ||||
| k8s.io/apimachinery v0.16.7-beta.0/go.mod h1:mhhO3hoLkWO+2eCvqjPtH2Ly92l9nJDwsswzWKpkN2w= | ||||
| k8s.io/apimachinery v0.17.8 h1:zXvd8rYMAjRJXpILP9tdAiUnFIENM9EmHuE81apIoms= | ||||
| k8s.io/apimachinery v0.17.8/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= | ||||
| k8s.io/apimachinery v0.18.2 h1:44CmtbmkzVDAhCpRVSiP2R5PPrC2RtlIv/MoB8xpdRA= | ||||
| k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= | ||||
| k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= | ||||
| k8s.io/client-go v0.0.0-20191225075139-73fd2ddc9180/go.mod h1:ksVkYlACXo9hR9AV+cYyCkuWL1xnWcGtAFxsfqMcozg= | ||||
| k8s.io/client-go v0.16.4 h1:sf+FEZXYhJNjpTZapQDLvvN+0kBeUTxCYxlXcVdhv2E= | ||||
| k8s.io/client-go v0.16.4/go.mod h1:ZgxhFDxSnoKY0J0U2/Y1C8obKDdlhGPZwA7oHH863Ok= | ||||
| k8s.io/client-go v0.17.8 h1:cuZSfjqVrNjoZ3wViQHljFPyWMOcgxUjjmQs5Rifbxk= | ||||
| k8s.io/client-go v0.17.8/go.mod h1:SJsDS64AAtt9VZyeaQMb4Ck5etCitZ/FwajWdzua5eY= | ||||
| k8s.io/client-go v0.18.2 h1:aLB0iaD4nmwh7arT2wIn+lMnAq7OswjaejkQ8p9bBYE= | ||||
| k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= | ||||
| k8s.io/code-generator v0.17.5/go.mod h1:qdiSCSTKtS+3WtPelj2h57fylSQcPUlhMVm+TD9Dvqc= | ||||
| k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= | ||||
| k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= | ||||
| k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | ||||
| k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | ||||
| k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | ||||
| k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | ||||
| k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | ||||
| k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | ||||
| @@ -755,15 +1108,37 @@ k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH | ||||
| k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= | ||||
| k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= | ||||
| k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= | ||||
| k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= | ||||
| k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= | ||||
| k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= | ||||
| k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= | ||||
| k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= | ||||
| k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | ||||
| k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | ||||
| k8s.io/utils v0.0.0-20191218082557-f07c713de883 h1:TA8t8OLS8m3/0dtTckekO0pCQ7qMnD19fsZTQEgCSKQ= | ||||
| k8s.io/utils v0.0.0-20191218082557-f07c713de883/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | ||||
| k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | ||||
| k8s.io/utils v0.0.0-20200327001022-6496210b90e8 h1:6JFbaLjRyBz8K2Jvt+pcT+N3vvwMZfg8MfVENwe9aag= | ||||
| k8s.io/utils v0.0.0-20200327001022-6496210b90e8/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | ||||
| modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= | ||||
| modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= | ||||
| modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= | ||||
| modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= | ||||
| modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= | ||||
| moul.io/http2curl v1.0.1-0.20190925090545-5cd742060b0e/go.mod h1:nejbQVfXh96n9dSF6cH3Jsk/QI1Z2oEL7sSI2ifXFNA= | ||||
| 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= | ||||
| sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= | ||||
| sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI= | ||||
| sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= | ||||
| sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= | ||||
| sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= | ||||
| sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= | ||||
| sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= | ||||
| sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= | ||||
| sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= | ||||
| sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= | ||||
| sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= | ||||
| upper.io/db.v3 v3.6.3+incompatible h1:SJLWd7H56Vwm4rYa+cHAQDYWcvvOt1C/5PD/IIBZPW8= | ||||
| upper.io/db.v3 v3.6.3+incompatible/go.mod h1:FgTdD24eBjJAbPKsQSiHUNgXjOR4Lub3u1UMHSIh82Y= | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								img/onepanel.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								img/onepanel.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.7 MiB | 
							
								
								
									
										27
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								main.go
									
									
									
									
									
								
							| @@ -4,20 +4,6 @@ import ( | ||||
| 	"context" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	apiv1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/fields" | ||||
| 	k8runtime "k8s.io/apimachinery/pkg/runtime" | ||||
| 	"k8s.io/apimachinery/pkg/watch" | ||||
| 	"k8s.io/client-go/tools/cache" | ||||
| 	"math" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/gorilla/handlers" | ||||
| 	grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" | ||||
| 	grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" | ||||
| @@ -34,6 +20,19 @@ import ( | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| 	"github.com/tmc/grpc-websocket-proxy/wsproxy" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	apiv1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/fields" | ||||
| 	k8runtime "k8s.io/apimachinery/pkg/runtime" | ||||
| 	"k8s.io/apimachinery/pkg/watch" | ||||
| 	"k8s.io/client-go/tools/cache" | ||||
| 	"math" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	sq "github.com/Masterminds/squirrel" | ||||
| 	argoprojv1alpha1 "github.com/argoproj/argo/pkg/client/clientset/versioned/typed/workflow/v1alpha1" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	"github.com/onepanelio/core/pkg/util/gcs" | ||||
| 	"github.com/onepanelio/core/pkg/util/router" | ||||
| 	"github.com/onepanelio/core/pkg/util/s3" | ||||
| @@ -18,6 +19,7 @@ type Config = rest.Config | ||||
| var sb = sq.StatementBuilder.PlaceholderFormat(sq.Dollar) | ||||
|  | ||||
| type Client struct { | ||||
| 	Token string | ||||
| 	kubernetes.Interface | ||||
| 	argoprojV1alpha1 argoprojv1alpha1.ArgoprojV1alpha1Interface | ||||
| 	*DB | ||||
| @@ -38,6 +40,37 @@ func NewConfig() (config *Config) { | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // GetDefaultClient loads a default k8s client | ||||
| func GetDefaultClient() (*Client, error) { | ||||
| 	kubeConfig := NewConfig() | ||||
| 	client, err := NewClient(kubeConfig, nil, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	config, err := client.GetSystemConfig() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	dbDriverName, dbDataSourceName := config.DatabaseConnection() | ||||
| 	client.DB = NewDB(sqlx.MustConnect(dbDriverName, dbDataSourceName)) | ||||
|  | ||||
| 	return client, nil | ||||
| } | ||||
|  | ||||
| // GetDefaultClientWithDB loads a default k8s client with an existing DB | ||||
| func GetDefaultClientWithDB(db *DB) (*Client, error) { | ||||
| 	kubeConfig := NewConfig() | ||||
| 	client, err := NewClient(kubeConfig, nil, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	client.DB = db | ||||
|  | ||||
| 	return client, nil | ||||
| } | ||||
|  | ||||
| // NewClient creates a client to interact with the Onepanel system. | ||||
| // It includes access to the database, kubernetes, argo, and configuration. | ||||
| func NewClient(config *Config, db *DB, systemConfig SystemConfig) (client *Client, err error) { | ||||
|   | ||||
| @@ -3,13 +3,12 @@ package v1 | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/onepanelio/core/pkg/util/ptr" | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| 	"gopkg.in/yaml.v3" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	k8yaml "sigs.k8s.io/yaml" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // SystemConfig is configuration loaded from kubernetes config and secrets that includes information about the | ||||
| @@ -38,6 +37,12 @@ func NewSystemConfig(configMap *ConfigMap, secret *Secret) (config SystemConfig, | ||||
| 	} | ||||
| 	config["databasePassword"] = string(databasePassword) | ||||
|  | ||||
| 	hmac, err := base64.StdEncoding.DecodeString(secret.Data["hmac"]) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	config["hmac"] = string(hmac) | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| @@ -183,6 +188,16 @@ func (s SystemConfig) UpdateNodePoolOptions(parameters []Parameter) ([]Parameter | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| // HMACKey gets the HMAC value, or nil. | ||||
| func (s SystemConfig) HMACKey() []byte { | ||||
| 	hmac := s.GetValue("hmac") | ||||
| 	if hmac == nil { | ||||
| 		return []byte{} | ||||
| 	} | ||||
|  | ||||
| 	return []byte(*hmac) | ||||
| } | ||||
|  | ||||
| // ArtifactRepositoryS3Provider is meant to be used | ||||
| // by the CLI. CLI will marshal this struct into the correct | ||||
| // YAML structure for k8s configmap / secret. | ||||
|   | ||||
| @@ -22,7 +22,7 @@ func ApplyLabelSelectQuery(labelSelector string, sb sq.SelectBuilder, filter Lab | ||||
| 		return sb, err | ||||
| 	} | ||||
|  | ||||
| 	sb = sb.Where("%v @> ?", labelSelector, labelsJSON) | ||||
| 	sb = sb.Where(labelSelector+" @> ?", labelsJSON) | ||||
|  | ||||
| 	return sb, nil | ||||
| } | ||||
|   | ||||
| @@ -8,8 +8,65 @@ import ( | ||||
| 	"github.com/onepanelio/core/pkg/util/mapping" | ||||
| 	"github.com/onepanelio/core/pkg/util/types" | ||||
| 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // SelectLabelsQuery represents the options available to filter a select labels query | ||||
| type SelectLabelsQuery struct { | ||||
| 	Table     string | ||||
| 	Alias     string | ||||
| 	Namespace string | ||||
| 	KeyLike   string | ||||
| 	Skip      []string | ||||
| } | ||||
|  | ||||
| // SkipKeysFromString parses keys encoded in a string and returns an array of keys | ||||
| // The separator is ";" | ||||
| func SkipKeysFromString(keys string) []string { | ||||
| 	results := make([]string, 0) | ||||
| 	for _, key := range strings.Split(keys, ";") { | ||||
| 		if key == "" { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		results = append(results, key) | ||||
| 	} | ||||
|  | ||||
| 	return results | ||||
| } | ||||
|  | ||||
| // SelectLabels returns a SelectBuilder that selects key, value columns from the criteria specified in query | ||||
| func SelectLabels(query *SelectLabelsQuery) sq.SelectBuilder { | ||||
| 	// Sample query | ||||
| 	// SELECT DISTINCT labels.* | ||||
| 	//	FROM workflow_executions w, | ||||
| 	//	jsonb_each_text(w.labels) labels | ||||
| 	// WHERE labels.key LIKE 'ca%' | ||||
| 	// AND labels.key NOT IN ('catdog') | ||||
| 	// AND namespace = 'onepanel' | ||||
| 	// AND labels != 'null'::jsonb | ||||
|  | ||||
| 	fromTable := fmt.Sprintf("%s %s", query.Table, query.Alias) | ||||
| 	fromJsonb := fmt.Sprintf("jsonb_each_text(%s.labels) labels", query.Alias) | ||||
|  | ||||
| 	bld := sb.Select("key", "value"). | ||||
| 		Distinct(). | ||||
| 		From(fromTable + ", " + fromJsonb). | ||||
| 		Where("labels != 'null'::jsonb") | ||||
|  | ||||
| 	if query.Namespace != "" { | ||||
| 		bld = bld.Where(sq.Eq{query.Alias + ".namespace": query.Namespace}) | ||||
| 	} | ||||
| 	if query.KeyLike != "" { | ||||
| 		bld = bld.Where(sq.Like{"labels.key": query.KeyLike}) | ||||
| 	} | ||||
| 	if len(query.Skip) != 0 { | ||||
| 		bld = bld.Where(sq.NotEq{"labels.key": query.Skip}) | ||||
| 	} | ||||
|  | ||||
| 	return bld | ||||
| } | ||||
|  | ||||
| func (c *Client) ListLabels(resource string, uid string) (labels []*Label, err error) { | ||||
| 	sb := sb.Select("labels"). | ||||
| 		From(TypeToTableName(resource)) | ||||
| @@ -49,6 +106,22 @@ func (c *Client) ListLabels(resource string, uid string) (labels []*Label, err e | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // ListAvailableLabels lists the labels available for the resource specified by the query | ||||
| func (c *Client) ListAvailableLabels(query *SelectLabelsQuery) (result []*Label, err error) { | ||||
| 	selectLabelsBuilder := SelectLabels(query) | ||||
|  | ||||
| 	// Don't select labels from Terminated workspaces. | ||||
| 	if query.Table == "workspaces" { | ||||
| 		selectLabelsBuilder = selectLabelsBuilder.Where(sq.NotEq{ | ||||
| 			"l.phase": "Terminated", | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	err = c.Selectx(&result, selectLabelsBuilder) | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (c *Client) AddLabels(namespace, resource, uid string, keyValues map[string]string) error { | ||||
| 	source, meta, err := c.GetK8sLabelResource(namespace, resource, uid) | ||||
| 	if err != nil { | ||||
|   | ||||
							
								
								
									
										81
									
								
								pkg/types.go
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								pkg/types.go
									
									
									
									
									
								
							| @@ -1,6 +1,9 @@ | ||||
| package v1 | ||||
|  | ||||
| import ( | ||||
| 	"database/sql/driver" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"time" | ||||
|  | ||||
| 	wfv1 "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" | ||||
| @@ -133,3 +136,81 @@ func WorkflowTemplatesToVersionIDs(workflowTemplates []*WorkflowTemplate) (ids [ | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Metrics is a convenience type to work with multiple Metric(s) | ||||
| type Metrics []*Metric | ||||
|  | ||||
| // Add adds the new metric to the metrics. | ||||
| // If there is already metrics with the same name, and override is true | ||||
| // the existing metrics will all be updated to the input value. Otherwise, they will be left unchanged. | ||||
| func (m *Metrics) Add(input *Metric, override bool) { | ||||
| 	foundExisting := false | ||||
|  | ||||
| 	for _, metric := range *m { | ||||
| 		if metric.Name == input.Name && override { | ||||
| 			foundExisting = true | ||||
|  | ||||
| 			metric.Value = input.Value | ||||
| 			metric.Format = input.Format | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !foundExisting { | ||||
| 		*m = append(*m, input) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Merge merges the metrics with other metrics | ||||
| // If there is already metrics with the same name and override is true | ||||
| // the existing metrics will all be updated to the input value. Otherwise they will be left unchanged. | ||||
| func (m *Metrics) Merge(input Metrics, override bool) { | ||||
| 	for _, item := range input { | ||||
| 		m.Add(item, override) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Unmarshal unmarshal's the json in m to v, as in json.Unmarshal. | ||||
| // This is to support Metrics working with JSONB column types in sql | ||||
| func (m *Metrics) Unmarshal(v interface{}) error { | ||||
| 	if len(*m) == 0 { | ||||
| 		*m = make([]*Metric, 0) | ||||
| 	} | ||||
|  | ||||
| 	v = m | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Value returns j as a value.  This does a validating unmarshal into another | ||||
| // RawMessage.  If j is invalid json, it returns an error. | ||||
| // Note that nil values will return "[]" - empty JSON. | ||||
| // This is to support Metrics working with JSONB column types in sql | ||||
| func (m Metrics) Value() (driver.Value, error) { | ||||
| 	if m == nil { | ||||
| 		return json.Marshal(make([]*Metric, 0)) | ||||
| 	} | ||||
|  | ||||
| 	return json.Marshal(m) | ||||
| } | ||||
|  | ||||
| // Scan stores the src in m.  No validation is done. | ||||
| // This is to support Metrics working with JSONB column types in sql | ||||
| func (m *Metrics) Scan(src interface{}) error { | ||||
| 	var source []byte | ||||
| 	switch t := src.(type) { | ||||
| 	case string: | ||||
| 		source = []byte(t) | ||||
| 	case []byte: | ||||
| 		if len(t) == 0 { | ||||
| 			source = []byte("[]") | ||||
| 		} else { | ||||
| 			source = t | ||||
| 		} | ||||
| 	case nil: | ||||
| 		*m = make([]*Metric, 0) | ||||
| 	default: | ||||
| 		return errors.New("incompatible type for Metrics") | ||||
| 	} | ||||
|  | ||||
| 	return json.Unmarshal(source, m) | ||||
| } | ||||
|   | ||||
							
								
								
									
										72
									
								
								pkg/types_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								pkg/types_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| package v1 | ||||
|  | ||||
| import ( | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| // TestMetrics_Add tests the Add method of the Metrics type | ||||
| func TestMetrics_Add(t *testing.T) { | ||||
| 	var initial Metrics = []*Metric{{ | ||||
| 		Name:   "accuracy", | ||||
| 		Value:  0.98, | ||||
| 		Format: "", | ||||
| 	}} | ||||
|  | ||||
| 	initial.Add(&Metric{ | ||||
| 		Name:   "success", | ||||
| 		Value:  1.0, | ||||
| 		Format: "%", | ||||
| 	}, false) | ||||
|  | ||||
| 	assert.Len(t, initial, 2) | ||||
|  | ||||
| 	initial.Add(&Metric{ | ||||
| 		Name:   "accuracy", | ||||
| 		Value:  0.99, | ||||
| 		Format: "%", | ||||
| 	}, false) | ||||
|  | ||||
| 	assert.Len(t, initial, 3) | ||||
|  | ||||
| 	initial.Add(&Metric{ | ||||
| 		Name:   "accuracy", | ||||
| 		Value:  0.99, | ||||
| 		Format: "%", | ||||
| 	}, true) | ||||
|  | ||||
| 	assert.Len(t, initial, 3) | ||||
| 	assert.True(t, initial[0].Value == 0.99) | ||||
| } | ||||
|  | ||||
| // TestMetrics_Merge tests the Merge method of the Metrics Type | ||||
| func TestMetrics_Merge(t *testing.T) { | ||||
| 	var initial Metrics = []*Metric{{ | ||||
| 		Name:   "accuracy", | ||||
| 		Value:  0.98, | ||||
| 		Format: "", | ||||
| 	}, { | ||||
| 		Name:   "success", | ||||
| 		Value:  1.0, | ||||
| 		Format: "%", | ||||
| 	}} | ||||
|  | ||||
| 	var toMerge Metrics = []*Metric{{ | ||||
| 		Name:   "accuracy", | ||||
| 		Value:  0.00, | ||||
| 		Format: "", | ||||
| 	}, { | ||||
| 		Name:   "success", | ||||
| 		Value:  1.0, | ||||
| 		Format: "%", | ||||
| 	}, { | ||||
| 		Name:   "test", | ||||
| 		Value:  0.5, | ||||
| 		Format: "", | ||||
| 	}} | ||||
|  | ||||
| 	initial.Merge(toMerge, true) | ||||
|  | ||||
| 	assert.Len(t, initial, 3) | ||||
| 	assert.True(t, initial[0].Value == 0.00) | ||||
| } | ||||
| @@ -1,6 +1,8 @@ | ||||
| package sql | ||||
|  | ||||
| import "fmt" | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // FormatColumnSelect returns a list of column names to be used in a SQL Select modified with optional alias and destination. | ||||
| // | ||||
|   | ||||
| @@ -21,7 +21,12 @@ func (l *JSONLabels) Unmarshal(v interface{}) error { | ||||
|  | ||||
| // Value returns j as a value.  This does a validating unmarshal into another | ||||
| // RawMessage.  If j is invalid json, it returns an error. | ||||
| // Note that nil values will return "{}" - empty JSON. | ||||
| func (l JSONLabels) Value() (driver.Value, error) { | ||||
| 	if l == nil { | ||||
| 		return json.Marshal(make(map[string]string)) | ||||
| 	} | ||||
|  | ||||
| 	return json.Marshal(l) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -8,6 +8,9 @@ import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	sq "github.com/Masterminds/squirrel" | ||||
| 	"github.com/argoproj/argo/persist/sqldb" | ||||
| 	"github.com/argoproj/argo/workflow/hydrator" | ||||
| 	"github.com/google/uuid" | ||||
| 	"github.com/onepanelio/core/pkg/util/gcs" | ||||
| 	"github.com/onepanelio/core/pkg/util/label" | ||||
| 	"github.com/onepanelio/core/pkg/util/ptr" | ||||
| @@ -18,9 +21,11 @@ import ( | ||||
| 	"gopkg.in/yaml.v2" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"k8s.io/apimachinery/pkg/api/resource" | ||||
| 	networking "istio.io/api/networking/v1alpha3" | ||||
| 	"k8s.io/apimachinery/pkg/util/intstr" | ||||
| 	"k8s.io/apimachinery/pkg/watch" | ||||
| 	"net/http" | ||||
| 	yaml2 "sigs.k8s.io/yaml" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| @@ -197,93 +202,21 @@ func injectArtifactRepositoryConfig(artifact *wfv1.Artifact, namespaceConfig *Na | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // injectContainerResourceQuotas adds resource requests and limits if they exist | ||||
| // Code grabs the resource request information from the nodeSelector, compared against running nodes. | ||||
| // If the running node is not present, no resource information is retrieved. | ||||
| func (c *Client) injectContainerResourceQuotas(wf *wfv1.Workflow, template *wfv1.Template, systemConfig SystemConfig) error { | ||||
| // injectHostPortToContainer adds a hostPort to the template container, if a nodeSelector is present. | ||||
| // Kubernetes will ensure that multiple containers with the same hostPort do not share the same node. | ||||
| func (c *Client) injectHostPortToContainer(template *wfv1.Template) error { | ||||
| 	if template.NodeSelector == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	supportedNodePoolLabels := []string{"beta.kubernetes.io/instance-type", "node.kubernetes.io/instance-type"} | ||||
| 	nodePoolLabel := "" | ||||
| 	var value string | ||||
| 	for k, v := range template.NodeSelector { | ||||
| 		for _, supportedNodePoolLabel := range supportedNodePoolLabels { | ||||
| 			if k == supportedNodePoolLabel { | ||||
| 				nodePoolLabel = k | ||||
| 				value = v | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	ports := []corev1.ContainerPort{ | ||||
| 		{Name: "node-capturer", HostPort: 80, ContainerPort: 80}, | ||||
| 	} | ||||
| 	if value == "" { | ||||
| 		return nil | ||||
| 	if template.Container != nil { | ||||
| 		template.Container.Ports = ports | ||||
| 	} | ||||
| 	if strings.Contains(value, "{{workflow.") { | ||||
| 		parts := strings.Split(strings.Replace(value, "}}", "", -1), ".") | ||||
| 		paramName := parts[len(parts)-1] | ||||
| 		for _, param := range wf.Spec.Arguments.Parameters { | ||||
| 			if param.Name == paramName && param.Value != nil { | ||||
| 				value = *param.Value | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	runningNodes, err := c.Interface.CoreV1().Nodes().List(ListOptions{}) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	var cpu string | ||||
| 	var memory string | ||||
| 	var gpu int64 | ||||
| 	gpuManufacturer := "" | ||||
| 	for _, node := range runningNodes.Items { | ||||
| 		if node.Labels[nodePoolLabel] == value { | ||||
| 			cpuInt := node.Status.Allocatable.Cpu().MilliValue() | ||||
| 			cpu = strconv.FormatFloat(float64(cpuInt)*.9, 'f', 0, 64) + "m" | ||||
| 			memoryInt := node.Status.Allocatable.Memory().MilliValue() | ||||
| 			kiBase := 1024.0 | ||||
| 			ninetyPerc := float64(memoryInt) * .9 | ||||
| 			toKi := ninetyPerc / kiBase / kiBase | ||||
| 			memory = strconv.FormatFloat(toKi, 'f', 0, 64) + "Ki" | ||||
| 			//Check for Nvidia | ||||
| 			gpuQuantity := node.Status.Allocatable["nvidia.com/gpu"] | ||||
| 			if gpuQuantity.IsZero() == false { | ||||
| 				gpu = gpuQuantity.Value() | ||||
| 				gpuManufacturer = "nvidia.com/gpu" | ||||
| 			} | ||||
|  | ||||
| 			//Check for AMD | ||||
| 			//Source: https://github.com/RadeonOpenCompute/k8s-device-plugin/blob/master/example/pod/alexnet-gpu.yaml | ||||
| 			gpuQuantity = node.Status.Allocatable["amd.com/gpu"] | ||||
| 			if gpuQuantity.IsZero() == false { | ||||
| 				gpu = gpuQuantity.Value() | ||||
| 				gpuManufacturer = "amd.com/gpu" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if cpu != "" && memory != "" { | ||||
| 		resourceList := corev1.ResourceRequirements{ | ||||
| 			Limits: nil, | ||||
| 			Requests: map[corev1.ResourceName]resource.Quantity{ | ||||
| 				corev1.ResourceCPU:    resource.MustParse(cpu), | ||||
| 				corev1.ResourceMemory: resource.MustParse(memory), | ||||
| 			}, | ||||
| 		} | ||||
| 		if gpu > 0 { | ||||
| 			stringGpu := strconv.FormatInt(gpu, 10) | ||||
| 			resourceList.Limits = make(map[corev1.ResourceName]resource.Quantity) | ||||
| 			resourceList.Limits[corev1.ResourceName(gpuManufacturer)] = resource.MustParse(stringGpu) | ||||
| 		} | ||||
| 		if template.Container != nil { | ||||
| 			template.Container.Resources = resourceList | ||||
| 		} | ||||
| 		if template.Script != nil { | ||||
| 			template.Script.Container.Resources = resourceList | ||||
| 		} | ||||
| 	if template.Script != nil { | ||||
| 		template.Script.Container.Ports = ports | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| @@ -348,6 +281,15 @@ func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts | ||||
| 			template.Metadata.Annotations = make(map[string]string) | ||||
| 		} | ||||
| 		template.Metadata.Annotations["sidecar.istio.io/inject"] = "false" | ||||
| 		//For workflows with accessible sidecars, we need istio | ||||
| 		//Istio does not prevent the main container from stopping | ||||
| 		for _, s := range template.Sidecars { | ||||
| 			if s.TTY == true { | ||||
| 				template.Metadata.Annotations["sidecar.istio.io/inject"] = "true" | ||||
| 				//Only need one instance to require istio injection | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if template.Container != nil { | ||||
| 			// Mount dev/shm | ||||
| @@ -355,7 +297,7 @@ func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts | ||||
| 				Name:      "sys-dshm", | ||||
| 				MountPath: "/dev/shm", | ||||
| 			}) | ||||
| 			err = c.injectContainerResourceQuotas(wf, template, systemConfig) | ||||
| 			err = c.injectHostPortToContainer(template) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -363,7 +305,7 @@ func (c *Client) injectAutomatedFields(namespace string, wf *wfv1.Workflow, opts | ||||
| 		} | ||||
|  | ||||
| 		if template.Script != nil { | ||||
| 			err = c.injectContainerResourceQuotas(wf, template, systemConfig) | ||||
| 			err = c.injectHostPortToContainer(template) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @@ -481,6 +423,11 @@ func (c *Client) createWorkflow(namespace string, workflowTemplateID uint64, wor | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	newTemplateOrder, err := c.injectAccessForSidecars(namespace, wf) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	wf.Spec.Templates = newTemplateOrder | ||||
| 	createdArgoWorkflow, err := c.ArgoprojV1alpha1().Workflows(namespace).Create(wf) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -510,49 +457,258 @@ func (c *Client) createWorkflow(namespace string, workflowTemplateID uint64, wor | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func ensureWorkflowRunsOnDedicatedNode(wf *wfv1.Workflow, config SystemConfig) (*wfv1.Workflow, error) { | ||||
| 	antiAffinityLabelKey := "onepanel.io/reserves-instance-type" | ||||
| 	nodeSelectorVal := "" | ||||
| 	addPodAffinity := false | ||||
| 	for i := range wf.Spec.Templates { | ||||
| 		template := &wf.Spec.Templates[i] | ||||
| 		if template.NodeSelector == nil { | ||||
| 			continue | ||||
| 		} | ||||
| func (c *Client) injectAccessForSidecars(namespace string, wf *wfv1.Workflow) ([]wfv1.Template, error) { | ||||
| 	var newTemplateOrder []wfv1.Template | ||||
| 	taskSysSendStatusName := "sys-send-status" | ||||
| 	taskSysSendExitStats := "sys-send-exit-stats" | ||||
| 	for tIdx, t := range wf.Spec.Templates { | ||||
| 		//Inject services, virtual routes | ||||
| 		for si, s := range t.Sidecars { | ||||
| 			//If TTY is true, sidecar needs to be accessible by HTTP | ||||
| 			//Otherwise, we skip the sidecar | ||||
| 			if s.TTY != true { | ||||
| 				continue | ||||
| 			} | ||||
| 			if len(s.Ports) == 0 { | ||||
| 				msg := fmt.Sprintf("sidecar %s must have at least one port.", s.Name) | ||||
| 				return nil, util.NewUserError(codes.InvalidArgument, msg) | ||||
| 			} | ||||
|  | ||||
| 		for _, v := range template.NodeSelector { | ||||
| 			if strings.Contains(v, "{{workflow.") { | ||||
| 				parts := strings.Split(strings.Replace(v, "}}", "", -1), ".") | ||||
| 				paramName := parts[len(parts)-1] | ||||
| 				for _, param := range wf.Spec.Arguments.Parameters { | ||||
| 					if param.Name == paramName && param.Value != nil { | ||||
| 						nodeSelectorVal = *param.Value | ||||
| 						break | ||||
| 			t.Sidecars[si].MirrorVolumeMounts = ptr.Bool(true) | ||||
| 			serviceNameUID := "s" + uuid.New().String() + "--" + namespace | ||||
| 			serviceNameUIDDNSCompliant, err := uid2.GenerateUID(serviceNameUID, 63) | ||||
| 			if err != nil { | ||||
| 				return nil, util.NewUserError(codes.InvalidArgument, err.Error()) | ||||
| 			} | ||||
|  | ||||
| 			serviceName := serviceNameUIDDNSCompliant + "." + *c.systemConfig.Domain() | ||||
|  | ||||
| 			serviceTemplateName := uuid.New().String() | ||||
| 			serviceTemplateNameAdd := "sys-k8s-service-template-add-" + serviceTemplateName | ||||
| 			serviceTemplateNameDelete := "sys-k8s-service-template-delete-" + serviceTemplateName | ||||
| 			serviceTaskName := "service-" + uuid.New().String() | ||||
| 			serviceAddTaskName := "sys-add-" + serviceTaskName | ||||
| 			serviceDeleteTaskName := "sys-delete-" + serviceTaskName | ||||
| 			virtualServiceTemplateName := uuid.New().String() | ||||
| 			virtualServiceTemplateNameAdd := "sys-k8s-virtual-service-template-add-" + virtualServiceTemplateName | ||||
| 			virtualServiceTemplateNameDelete := "sys-k8s-virtual-service-template-delete-" + virtualServiceTemplateName | ||||
| 			virtualServiceTaskName := "virtual-service-" + uuid.New().String() | ||||
| 			virtualServiceAddTaskName := "sys-add-" + virtualServiceTaskName | ||||
| 			virtualServiceDeleteTaskName := "sys-delete-" + virtualServiceTaskName | ||||
| 			var servicePorts []corev1.ServicePort | ||||
| 			var routes []*networking.HTTPRoute | ||||
| 			for _, port := range s.Ports { | ||||
| 				servicePort := corev1.ServicePort{ | ||||
| 					Name:       port.Name, | ||||
| 					Protocol:   port.Protocol, | ||||
| 					Port:       port.ContainerPort, | ||||
| 					TargetPort: intstr.FromInt(int(port.ContainerPort)), | ||||
| 				} | ||||
| 				servicePorts = append(servicePorts, servicePort) | ||||
| 				route := networking.HTTPRoute{ | ||||
| 					Match: []*networking.HTTPMatchRequest{ | ||||
| 						{ | ||||
| 							Uri: &networking.StringMatch{ | ||||
| 								MatchType: &networking.StringMatch_Prefix{ | ||||
| 									Prefix: "/"}, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 					Route: []*networking.HTTPRouteDestination{ | ||||
| 						{ | ||||
| 							Destination: &networking.Destination{ | ||||
| 								Host: serviceNameUIDDNSCompliant, | ||||
| 								Port: &networking.PortSelector{ | ||||
| 									Number: uint32(port.ContainerPort), | ||||
| 								}, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				} | ||||
| 				routes = append(routes, &route) | ||||
| 			} | ||||
| 			service := corev1.Service{ | ||||
| 				TypeMeta: metav1.TypeMeta{ | ||||
| 					APIVersion: "v1", | ||||
| 					Kind:       "Service", | ||||
| 				}, | ||||
| 				ObjectMeta: metav1.ObjectMeta{ | ||||
| 					Name: serviceNameUIDDNSCompliant, | ||||
| 				}, | ||||
| 				Spec: corev1.ServiceSpec{ | ||||
| 					Ports: servicePorts, | ||||
| 					Selector: map[string]string{ | ||||
| 						serviceTaskName: serviceNameUIDDNSCompliant, | ||||
| 					}, | ||||
| 				}, | ||||
| 			} | ||||
| 			//Istio needs to know which pod to setup the route to | ||||
| 			if wf.Spec.Templates[tIdx].Metadata.Labels == nil { | ||||
| 				wf.Spec.Templates[tIdx].Metadata.Labels = make(map[string]string) | ||||
| 			} | ||||
| 			wf.Spec.Templates[tIdx].Metadata.Labels[serviceTaskName] = serviceNameUIDDNSCompliant | ||||
| 			serviceManifestBytes, err := yaml2.Marshal(service) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			serviceManifest := string(serviceManifestBytes) | ||||
| 			templateServiceResource := wfv1.Template{ | ||||
| 				Name: serviceTemplateNameAdd, | ||||
| 				Metadata: wfv1.Metadata{ | ||||
| 					Annotations: map[string]string{ | ||||
| 						"sidecar.istio.io/inject": "false", | ||||
| 					}, | ||||
| 				}, | ||||
| 				Resource: &wfv1.ResourceTemplate{ | ||||
| 					Action:   "create", | ||||
| 					Manifest: serviceManifest, | ||||
| 				}, | ||||
| 			} | ||||
| 			newTemplateOrder = append(newTemplateOrder, templateServiceResource) | ||||
| 			//routes | ||||
| 			virtualServiceNameUUID := "vs-" + uuid.New().String() | ||||
| 			hosts := []string{serviceName} | ||||
| 			wf.Spec.Templates[tIdx].Outputs.Parameters = append(wf.Spec.Templates[tIdx].Outputs.Parameters, | ||||
| 				wfv1.Parameter{Name: "sys-sidecar-url--" + s.Name, Value: &serviceName}, | ||||
| 			) | ||||
| 			virtualService := map[string]interface{}{ | ||||
| 				"apiVersion": "networking.istio.io/v1alpha3", | ||||
| 				"kind":       "VirtualService", | ||||
| 				"metadata": metav1.ObjectMeta{ | ||||
| 					Name: virtualServiceNameUUID, | ||||
| 				}, | ||||
| 				"spec": networking.VirtualService{ | ||||
| 					Http:     routes, | ||||
| 					Gateways: []string{"istio-system/ingressgateway"}, | ||||
| 					Hosts:    hosts, | ||||
| 				}, | ||||
| 			} | ||||
|  | ||||
| 			virtualServiceManifestBytes, err := yaml2.Marshal(virtualService) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			virtualServiceManifest := string(virtualServiceManifestBytes) | ||||
|  | ||||
| 			templateRouteResource := wfv1.Template{ | ||||
| 				Name: virtualServiceTemplateNameAdd, | ||||
| 				Metadata: wfv1.Metadata{ | ||||
| 					Annotations: map[string]string{ | ||||
| 						"sidecar.istio.io/inject": "false", | ||||
| 					}, | ||||
| 				}, | ||||
| 				Resource: &wfv1.ResourceTemplate{ | ||||
| 					Action:   "create", | ||||
| 					Manifest: virtualServiceManifest, | ||||
| 				}, | ||||
| 			} | ||||
| 			newTemplateOrder = append(newTemplateOrder, templateRouteResource) | ||||
|  | ||||
| 			for i2, t2 := range wf.Spec.Templates { | ||||
| 				if t2.Name == wf.Spec.Entrypoint { | ||||
| 					if t2.DAG != nil { | ||||
| 						tasks := wf.Spec.Templates[i2].DAG.Tasks | ||||
| 						t := tasks[0] | ||||
| 						sysDepFound := false | ||||
| 						for _, d := range t.Dependencies { | ||||
| 							if d == taskSysSendStatusName { | ||||
| 								sysDepFound = true | ||||
| 								wf.Spec.Templates[i2].DAG.Tasks[0].Dependencies = | ||||
| 									[]string{virtualServiceAddTaskName} | ||||
| 							} | ||||
| 						} | ||||
| 						if sysDepFound == false { | ||||
| 							wf.Spec.Templates[i2].DAG.Tasks[0].Dependencies = append(wf.Spec.Templates[i2].DAG.Tasks[0].Dependencies, virtualServiceAddTaskName) | ||||
| 						} | ||||
|  | ||||
| 						wf.Spec.Templates[i2].DAG.Tasks = append(tasks, []wfv1.DAGTask{ | ||||
| 							{ | ||||
| 								Name:         serviceAddTaskName, | ||||
| 								Template:     serviceTemplateNameAdd, | ||||
| 								Dependencies: []string{taskSysSendStatusName}, | ||||
| 							}, | ||||
| 							{ | ||||
| 								Name:         virtualServiceAddTaskName, | ||||
| 								Template:     virtualServiceTemplateNameAdd, | ||||
| 								Dependencies: []string{serviceAddTaskName}, | ||||
| 							}, | ||||
| 						}...) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			break | ||||
| 		} | ||||
| 		template.Metadata.Labels = map[string]string{antiAffinityLabelKey: nodeSelectorVal} | ||||
| 		addPodAffinity = true | ||||
| 	} | ||||
| 	if addPodAffinity { | ||||
| 		wf.Spec.Affinity = &corev1.Affinity{ | ||||
| 			PodAntiAffinity: &corev1.PodAntiAffinity{ | ||||
| 				RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{ | ||||
| 					{ | ||||
| 						LabelSelector: &metav1.LabelSelector{ | ||||
| 							MatchExpressions: []metav1.LabelSelectorRequirement{ | ||||
| 								{Key: antiAffinityLabelKey, Operator: "In", Values: []string{nodeSelectorVal}}, | ||||
| 							}, | ||||
| 						}, | ||||
| 						TopologyKey: "kubernetes.io/hostname", | ||||
| 			//Inject clean-up for service and virtualservice | ||||
| 			templateServiceDeleteResource := wfv1.Template{ | ||||
| 				Name: serviceTemplateNameDelete, | ||||
| 				Metadata: wfv1.Metadata{ | ||||
| 					Annotations: map[string]string{ | ||||
| 						"sidecar.istio.io/inject": "false", | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 				Resource: &wfv1.ResourceTemplate{ | ||||
| 					Action:   "delete", | ||||
| 					Manifest: serviceManifest, | ||||
| 				}, | ||||
| 			} | ||||
| 			newTemplateOrder = append(newTemplateOrder, templateServiceDeleteResource) | ||||
|  | ||||
| 			templateRouteDeleteResource := wfv1.Template{ | ||||
| 				Name: virtualServiceTemplateNameDelete, | ||||
| 				Metadata: wfv1.Metadata{ | ||||
| 					Annotations: map[string]string{ | ||||
| 						"sidecar.istio.io/inject": "false", | ||||
| 					}, | ||||
| 				}, | ||||
| 				Resource: &wfv1.ResourceTemplate{ | ||||
| 					Action:   "delete", | ||||
| 					Manifest: virtualServiceManifest, | ||||
| 				}, | ||||
| 			} | ||||
|  | ||||
| 			newTemplateOrder = append(newTemplateOrder, templateRouteDeleteResource) | ||||
|  | ||||
| 			dagTasks := []wfv1.DAGTask{ | ||||
| 				{ | ||||
| 					Name:     serviceDeleteTaskName, | ||||
| 					Template: serviceTemplateNameDelete, | ||||
| 				}, | ||||
| 				{ | ||||
| 					Name:         virtualServiceDeleteTaskName, | ||||
| 					Template:     virtualServiceTemplateNameDelete, | ||||
| 					Dependencies: []string{serviceDeleteTaskName}, | ||||
| 				}, | ||||
| 			} | ||||
| 			if wf.Spec.OnExit != "" { | ||||
| 				for _, t := range wf.Spec.Templates { | ||||
| 					if t.Name == wf.Spec.OnExit { | ||||
| 						t.DAG.Tasks = append(t.DAG.Tasks, dagTasks...) | ||||
| 						sysExitDepFound := false | ||||
| 						for dti, dt := range t.DAG.Tasks { | ||||
| 							if dt.Name == taskSysSendExitStats { | ||||
| 								sysExitDepFound = true | ||||
| 								t.DAG.Tasks[dti].Dependencies = append(t.DAG.Tasks[dti].Dependencies, virtualServiceDeleteTaskName) | ||||
| 							} | ||||
| 						} | ||||
| 						if sysExitDepFound == false { | ||||
| 							t.DAG.Tasks[0].Dependencies = append(t.DAG.Tasks[0].Dependencies, virtualServiceDeleteTaskName) | ||||
| 						} | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
| 			} else { | ||||
| 				exitHandlerDAG := wfv1.Template{ | ||||
| 					Name: "exit-handler", | ||||
| 					DAG: &wfv1.DAGTemplate{ | ||||
| 						Tasks: dagTasks, | ||||
| 					}, | ||||
| 				} | ||||
| 				wf.Spec.OnExit = "exit-handler" | ||||
| 				wf.Spec.Templates = append(wf.Spec.Templates, exitHandlerDAG) | ||||
| 			} | ||||
| 		} | ||||
| 		newTemplateOrder = append(newTemplateOrder, wf.Spec.Templates[tIdx]) | ||||
|  | ||||
| 	} | ||||
| 	return wf, nil | ||||
| 	return newTemplateOrder, nil | ||||
| } | ||||
|  | ||||
| func (c *Client) ValidateWorkflowExecution(namespace string, manifest []byte) (err error) { | ||||
| @@ -567,11 +723,12 @@ func (c *Client) ValidateWorkflowExecution(namespace string, manifest []byte) (e | ||||
| 	} | ||||
|  | ||||
| 	wftmplGetter := templateresolution.WrapWorkflowTemplateInterface(c.ArgoprojV1alpha1().WorkflowTemplates(namespace)) | ||||
| 	cwftmplGetter := templateresolution.WrapClusterWorkflowTemplateInterface(c.argoprojV1alpha1.ClusterWorkflowTemplates()) | ||||
| 	for _, wf := range workflows { | ||||
| 		if err = c.injectAutomatedFields(namespace, &wf, &WorkflowExecutionOptions{}); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		_, err = validate.ValidateWorkflow(wftmplGetter, &wf, validate.ValidateOpts{}) | ||||
| 		_, err = validate.ValidateWorkflow(wftmplGetter, cwftmplGetter, &wf, validate.ValidateOpts{}) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| @@ -697,6 +854,7 @@ func (c *Client) createWorkflowExecutionDB(namespace string, workflowExecution * | ||||
| 			"parameters":                   string(parametersJSON), | ||||
| 			"is_archived":                  false, | ||||
| 			"labels":                       workflowExecution.Labels, | ||||
| 			"metrics":                      workflowExecution.Metrics, | ||||
| 		}). | ||||
| 		Suffix("RETURNING id"). | ||||
| 		RunWith(c.DB). | ||||
| @@ -706,7 +864,7 @@ func (c *Client) createWorkflowExecutionDB(namespace string, workflowExecution * | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (c *Client) FinishWorkflowExecutionStatisticViaExitHandler(namespace, name string, workflowTemplateID int64, phase wfv1.NodePhase, startedAt time.Time) (err error) { | ||||
| func (c *Client) FinishWorkflowExecutionStatisticViaExitHandler(namespace, name string, phase wfv1.NodePhase, startedAt time.Time) (err error) { | ||||
| 	_, err = sb.Update("workflow_executions"). | ||||
| 		SetMap(sq.Eq{ | ||||
| 			"started_at":  startedAt.UTC(), | ||||
| @@ -715,7 +873,10 @@ func (c *Client) FinishWorkflowExecutionStatisticViaExitHandler(namespace, name | ||||
| 			"finished_at": time.Now().UTC(), | ||||
| 			"phase":       phase, | ||||
| 		}). | ||||
| 		Where(sq.Eq{"name": name}). | ||||
| 		Where(sq.And{ | ||||
| 			sq.Eq{"name": name}, | ||||
| 			sq.NotEq{"phase": "Terminated"}, | ||||
| 		}). | ||||
| 		RunWith(c.DB). | ||||
| 		Exec() | ||||
|  | ||||
| @@ -757,6 +918,7 @@ func (c *Client) CronStartWorkflowExecutionStatisticInsert(namespace, uid string | ||||
| 			"cron_workflow_id":             cronWorkflow.ID, | ||||
| 			"parameters":                   string(parametersJSON), | ||||
| 			"labels":                       cronWorkflow.Labels, | ||||
| 			"metrics":                      Metrics{}, | ||||
| 		}). | ||||
| 		Suffix("RETURNING id"). | ||||
| 		RunWith(c.DB). | ||||
| @@ -1262,7 +1424,8 @@ func (c *Client) RetryWorkflowExecution(namespace, uid string) (workflow *Workfl | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	wf, err = argoutil.RetryWorkflow(c, c.ArgoprojV1alpha1().Workflows(namespace), wf) | ||||
| 	h := hydrator.New(sqldb.ExplosiveOffloadNodeStatusRepo) | ||||
| 	wf, err = argoutil.RetryWorkflow(c, h, c.ArgoprojV1alpha1().Workflows(namespace), wf, true, "") | ||||
|  | ||||
| 	workflow = typeWorkflow(wf) | ||||
|  | ||||
| @@ -1280,7 +1443,7 @@ func (c *Client) ResubmitWorkflowExecution(namespace, uid string) (workflow *Wor | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	wf, err = argoutil.SubmitWorkflow(c.ArgoprojV1alpha1().Workflows(namespace), c, namespace, wf, &argoutil.SubmitOpts{}) | ||||
| 	wf, err = argoutil.SubmitWorkflow(c.ArgoprojV1alpha1().Workflows(namespace), c, namespace, wf, &wfv1.SubmitOpts{}) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| @@ -1291,7 +1454,9 @@ func (c *Client) ResubmitWorkflowExecution(namespace, uid string) (workflow *Wor | ||||
| } | ||||
|  | ||||
| func (c *Client) ResumeWorkflowExecution(namespace, uid string) (workflow *WorkflowExecution, err error) { | ||||
| 	err = argoutil.ResumeWorkflow(c.ArgoprojV1alpha1().Workflows(namespace), uid, "") | ||||
| 	// TODO Review hydrator | ||||
| 	h := hydrator.New(sqldb.ExplosiveOffloadNodeStatusRepo) | ||||
| 	err = argoutil.ResumeWorkflow(c.ArgoprojV1alpha1().Workflows(namespace), h, uid, "") | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| @@ -1325,7 +1490,8 @@ func (c *Client) TerminateWorkflowExecution(namespace, uid string) (err error) { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	err = argoutil.TerminateWorkflow(c.ArgoprojV1alpha1().Workflows(namespace), uid) | ||||
| 	h := hydrator.New(sqldb.ExplosiveOffloadNodeStatusRepo) | ||||
| 	err = argoutil.StopWorkflow(c.ArgoprojV1alpha1().Workflows(namespace), h, uid, "", "") | ||||
|  | ||||
| 	return | ||||
| } | ||||
| @@ -1413,7 +1579,7 @@ func (c *Client) ListFiles(namespace, key string) (files []*File, err error) { | ||||
|  | ||||
| 			doneCh := make(chan struct{}) | ||||
| 			defer close(doneCh) | ||||
| 			for objInfo := range s3Client.ListObjectsV2(config.ArtifactRepository.S3.Bucket, key, false, doneCh) { | ||||
| 			for objInfo := range s3Client.ListObjects(config.ArtifactRepository.S3.Bucket, key, false, doneCh) { | ||||
| 				if objInfo.Key == key { | ||||
| 					continue | ||||
| 				} | ||||
| @@ -1487,20 +1653,22 @@ func filterOutCustomTypesFromManifest(manifest []byte) (result []byte, err error | ||||
| 		return manifest, nil | ||||
| 	} | ||||
|  | ||||
| 	specMap, ok := spec.(map[string]interface{}) | ||||
| 	if !ok { | ||||
| 	specMap, err := convertMapToStringKeys(spec.(map[interface{}]interface{})) | ||||
| 	if err != nil { | ||||
| 		return manifest, nil | ||||
| 	} | ||||
| 	data["spec"] = specMap | ||||
|  | ||||
| 	arguments, ok := specMap["arguments"] | ||||
| 	if !ok { | ||||
| 		return manifest, nil | ||||
| 	} | ||||
|  | ||||
| 	argumentsMap, ok := arguments.(map[string]interface{}) | ||||
| 	if !ok { | ||||
| 	argumentsMap, err := convertMapToStringKeys(arguments.(map[interface{}]interface{})) | ||||
| 	if err != nil { | ||||
| 		return manifest, nil | ||||
| 	} | ||||
| 	specMap["arguments"] = argumentsMap | ||||
|  | ||||
| 	parameters, ok := argumentsMap["parameters"] | ||||
| 	if !ok { | ||||
| @@ -1516,8 +1684,8 @@ func filterOutCustomTypesFromManifest(manifest []byte) (result []byte, err error | ||||
| 	parametersToKeep := make([]interface{}, 0) | ||||
|  | ||||
| 	for _, parameter := range parametersList { | ||||
| 		paramMap, ok := parameter.(map[string]interface{}) | ||||
| 		if !ok { | ||||
| 		paramMap, err := convertMapToStringKeys(parameter.(map[interface{}]interface{})) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| @@ -1526,7 +1694,7 @@ func filterOutCustomTypesFromManifest(manifest []byte) (result []byte, err error | ||||
| 			paramMap["value"] = "<value>" | ||||
| 		} | ||||
|  | ||||
| 		parametersToKeep = append(parametersToKeep, parameter) | ||||
| 		parametersToKeep = append(parametersToKeep, paramMap) | ||||
|  | ||||
| 		keysToDelete := make([]string, 0) | ||||
| 		for key := range paramMap { | ||||
| @@ -1881,13 +2049,13 @@ func injectWorkflowExecutionStatusCaller(wf *wfv1.Workflow, phase wfv1.NodePhase | ||||
| 				for j, task := range t.DAG.Tasks { | ||||
| 					if task.Dependencies == nil { | ||||
| 						wf.Spec.Templates[i].DAG.Tasks[j].Dependencies = []string{containerTemplate.Name} | ||||
| 						wf.Spec.Templates[i].DAG.Tasks = append(t.DAG.Tasks, wfv1.DAGTask{ | ||||
| 							Name:     containerTemplate.Name, | ||||
| 							Template: containerTemplate.Name, | ||||
| 						}) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			wf.Spec.Templates[i].DAG.Tasks = append(t.DAG.Tasks, wfv1.DAGTask{ | ||||
| 				Name:     containerTemplate.Name, | ||||
| 				Template: containerTemplate.Name, | ||||
| 			}) | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| @@ -1924,14 +2092,14 @@ func workflowExecutionsSelectBuilderNoColumns(namespace, workflowTemplateUID, wo | ||||
|  | ||||
| func workflowExecutionsSelectBuilder(namespace, workflowTemplateUID, workflowTemplateVersion string, includeSystem bool) sq.SelectBuilder { | ||||
| 	sb := workflowExecutionsSelectBuilderNoColumns(namespace, workflowTemplateUID, workflowTemplateVersion, includeSystem) | ||||
| 	sb = sb.Columns(getWorkflowExecutionColumns("we", "")...). | ||||
| 	sb = sb.Columns(getWorkflowExecutionColumns("we")...). | ||||
| 		Columns(`wtv.version "workflow_template.version"`, `wtv.created_at "workflow_template.created_at"`, `wt.name "workflow_template.name"`, `wt.uid "workflow_template.uid"`) | ||||
|  | ||||
| 	return sb | ||||
| } | ||||
|  | ||||
| func (c *Client) getWorkflowExecutionAndTemplate(namespace string, uid string) (workflow *WorkflowExecution, err error) { | ||||
| 	sb := sb.Select(getWorkflowExecutionColumns("we", "")...). | ||||
| 	sb := sb.Select(getWorkflowExecutionColumns("we")...). | ||||
| 		Columns(getWorkflowTemplateColumns("wt", "workflow_template")...). | ||||
| 		Columns(`wtv.manifest "workflow_template.manifest"`, `wtv.version "workflow_template.version"`). | ||||
| 		From("workflow_executions we"). | ||||
| @@ -1981,3 +2149,71 @@ func (c *Client) UpdateWorkflowExecutionStatus(namespace, uid string, status *Wo | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // AddWorkflowExecutionMetrics merges the metrics provided with the ones present in the workflow execution identified by (namespace, uid) | ||||
| func (c *Client) AddWorkflowExecutionMetrics(namespace, uid string, metrics Metrics, override bool) (workflowExecution *WorkflowExecution, err error) { | ||||
| 	workflowExecution, err = c.GetWorkflowExecution(namespace, uid) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if workflowExecution == nil { | ||||
| 		return nil, util.NewUserError(codes.NotFound, "Workflow execution not found") | ||||
| 	} | ||||
|  | ||||
| 	workflowExecution.Metrics.Merge(metrics, override) | ||||
|  | ||||
| 	_, err = sb.Update("workflow_executions"). | ||||
| 		Set("metrics", workflowExecution.Metrics). | ||||
| 		Where(sq.Eq{ | ||||
| 			"namespace": namespace, | ||||
| 			"uid":       uid, | ||||
| 		}). | ||||
| 		RunWith(c.DB). | ||||
| 		Exec() | ||||
| 	if err != nil { | ||||
| 		return nil, util.NewUserError(codes.Internal, "Error updating metrics.") | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // UpdateWorkflowExecutionMetrics replaces the metrics of a workflow execution identified by (namespace, uid) with the input metrics. | ||||
| func (c *Client) UpdateWorkflowExecutionMetrics(namespace, uid string, metrics Metrics) (workflowExecution *WorkflowExecution, err error) { | ||||
| 	workflowExecution, err = c.GetWorkflowExecution(namespace, uid) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if workflowExecution == nil { | ||||
| 		return nil, util.NewUserError(codes.NotFound, "Workflow execution not found") | ||||
| 	} | ||||
|  | ||||
| 	workflowExecution.Metrics = metrics | ||||
|  | ||||
| 	_, err = sb.Update("workflow_executions"). | ||||
| 		Set("metrics", workflowExecution.Metrics). | ||||
| 		Where(sq.Eq{ | ||||
| 			"namespace": namespace, | ||||
| 			"uid":       uid, | ||||
| 		}). | ||||
| 		RunWith(c.DB). | ||||
| 		Exec() | ||||
| 	if err != nil { | ||||
| 		return nil, util.NewUserError(codes.Internal, "Error updating metrics.") | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func convertMapToStringKeys(input map[interface{}]interface{}) (output map[string]interface{}, err error) { | ||||
| 	output = make(map[string]interface{}) | ||||
| 	for key, value := range input { | ||||
| 		keyString, ok := key.(string) | ||||
| 		if ok { | ||||
| 			output[keyString] = value | ||||
| 		} else { | ||||
| 			return nil, fmt.Errorf("unable to parse key as a string") | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return output, nil | ||||
| } | ||||
|   | ||||
| @@ -25,6 +25,7 @@ type WorkflowExecution struct { | ||||
| 	FinishedAt       *time.Time        `db:"finished_at"` | ||||
| 	WorkflowTemplate *WorkflowTemplate `db:"workflow_template"` | ||||
| 	Labels           types.JSONLabels | ||||
| 	Metrics          Metrics | ||||
| 	ArgoWorkflow     *wfv1.Workflow | ||||
| } | ||||
|  | ||||
| @@ -105,7 +106,18 @@ func (we *WorkflowExecution) GetParameterValue(name string) *string { | ||||
| // getWorkflowExecutionColumns returns all of the columns for workflowExecution modified by alias, destination. | ||||
| // see formatColumnSelect | ||||
| func getWorkflowExecutionColumns(aliasAndDestination ...string) []string { | ||||
| 	columns := []string{"id", "created_at", "uid", "name", "parameters", "phase", "started_at", "finished_at", "labels"} | ||||
| 	columns := []string{ | ||||
| 		"id", | ||||
| 		"created_at", | ||||
| 		"uid", | ||||
| 		"name", | ||||
| 		"parameters", | ||||
| 		"phase", | ||||
| 		"started_at", | ||||
| 		"finished_at", | ||||
| 		"labels", | ||||
| 		"metrics", | ||||
| 	} | ||||
| 	return sql.FormatColumnSelect(columns, aliasAndDestination...) | ||||
| } | ||||
|  | ||||
| @@ -119,6 +131,7 @@ func getWorkflowExecutionColumnsMap(camelCase bool) map[string]string { | ||||
| 		"parameters": "parameters", | ||||
| 		"phase":      "phase", | ||||
| 		"labels":     "labels", | ||||
| 		"metrics":    "metrics", | ||||
| 	} | ||||
|  | ||||
| 	if camelCase { | ||||
|   | ||||
							
								
								
									
										116
									
								
								pkg/workspace.go
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								pkg/workspace.go
									
									
									
									
									
								
							| @@ -15,7 +15,6 @@ import ( | ||||
| 	"github.com/onepanelio/core/pkg/util/request" | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
| @@ -286,32 +285,15 @@ func (c *Client) addResourceRequestsAndLimitsToWorkspaceTemplate(t wfv1.Template | ||||
| 	if !ok { | ||||
| 		return nil, errors.New("unable to type check statefulset manifest") | ||||
| 	} | ||||
| 	//Get node selected | ||||
| 	labelKey := "sys-node-pool-label" | ||||
| 	labelKeyVal := "" | ||||
| 	for _, parameter := range argoTemplate.Spec.Arguments.Parameters { | ||||
| 		if parameter.Name == labelKey { | ||||
| 			labelKeyVal = *parameter.Value | ||||
| 	extraContainer := generateExtraContainerWithHostPortToSequesterNode() | ||||
| 	if extraContainer != nil { | ||||
| 		containers, ok := templateSpec["containers"].([]interface{}) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("unable to type check statefulset manifest") | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	nodePoolKey := "sys-node-pool" | ||||
| 	nodePoolVal := "" | ||||
| 	for _, parameter := range workspace.Parameters { | ||||
| 		if parameter.Name == nodePoolKey { | ||||
| 			nodePoolVal = *parameter.Value | ||||
| 		} | ||||
| 		templateSpec["containers"] = append([]interface{}{extraContainer}, containers...) | ||||
| 	} | ||||
| 	extraContainer, err := generateExtraContainerWithResources(c, labelKeyVal, nodePoolVal) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	containers, ok := templateSpec["containers"].([]interface{}) | ||||
| 	if !ok { | ||||
| 		return nil, errors.New("unable to type check statefulset manifest") | ||||
| 	} | ||||
|  | ||||
| 	templateSpec["containers"] = append([]interface{}{extraContainer}, containers...) | ||||
| 	resultManifest, err := yaml.Marshal(statefulSet) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -319,78 +301,25 @@ func (c *Client) addResourceRequestsAndLimitsToWorkspaceTemplate(t wfv1.Template | ||||
| 	return resultManifest, nil | ||||
| } | ||||
|  | ||||
| // generateExtraContainerWithResources will add an extra container to a workspace. | ||||
| // The extra container will have the calculated resource request for the node selected by the workspace. | ||||
| // generateExtraContainerWithHostPortToSequesterNode will add an extra container to a workspace. | ||||
| // The extra container have a hostPort set. Kubernetes will ensure the hostPort does not get conflict | ||||
| // between containers, scheduling a new node as needed. | ||||
| // The container will sleep once started, and generally consume negligible resources. | ||||
| // | ||||
| // The node that was selected has to be already running, in order to get the resource request correct. | ||||
| func generateExtraContainerWithResources(c *Client, labelKeyVal string, nodePoolVal string) (map[string]interface{}, error) { | ||||
| 	runningNodes, err := c.Interface.CoreV1().Nodes().List(ListOptions{}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	var cpu string | ||||
| 	var memory string | ||||
| 	var gpu int64 | ||||
| 	gpuManufacturer := "" | ||||
| 	for _, node := range runningNodes.Items { | ||||
| 		if node.Labels[labelKeyVal] == nodePoolVal { | ||||
| 			cpuInt := node.Status.Allocatable.Cpu().MilliValue() | ||||
| 			cpu = strconv.FormatFloat(float64(cpuInt)*.9, 'f', 0, 64) + "m" | ||||
| 			memoryInt := node.Status.Allocatable.Memory().MilliValue() | ||||
| 			kiBase := 1024.0 | ||||
| 			ninetyPerc := float64(memoryInt) * .9 | ||||
| 			toKi := ninetyPerc / kiBase / kiBase | ||||
| 			memory = strconv.FormatFloat(toKi, 'f', 0, 64) + "Ki" | ||||
| 			//Check for Nvidia | ||||
| 			gpuQuantity := node.Status.Allocatable["nvidia.com/gpu"] | ||||
| 			if gpuQuantity.IsZero() == false { | ||||
| 				gpu = gpuQuantity.Value() | ||||
| 				gpuManufacturer = "nvidia.com/gpu" | ||||
| 			} | ||||
|  | ||||
| 			//Check for AMD | ||||
| 			//Source: https://github.com/RadeonOpenCompute/k8s-device-plugin/blob/master/example/pod/alexnet-gpu.yaml | ||||
| 			gpuQuantity = node.Status.Allocatable["amd.com/gpu"] | ||||
| 			if gpuQuantity.IsZero() == false { | ||||
| 				gpu = gpuQuantity.Value() | ||||
| 				gpuManufacturer = "amd.com/gpu" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| func generateExtraContainerWithHostPortToSequesterNode() map[string]interface{} { | ||||
| 	extraContainer := map[string]interface{}{ | ||||
| 		"image":   "alpine:latest", | ||||
| 		"name":    "resource-requester", | ||||
| 		"name":    "node-capturer", | ||||
| 		"command": []interface{}{"/bin/sh"}, | ||||
| 		"args":    []interface{}{"-c", "while :; do sleep 2073600; done"}, | ||||
| 		"resources": map[string]interface{}{ | ||||
| 			"requests": map[string]interface{}{ | ||||
| 				"cpu":    cpu, | ||||
| 				"memory": memory, | ||||
| 		"ports": []interface{}{ | ||||
| 			map[string]interface{}{ | ||||
| 				"name":          "node-capturer", | ||||
| 				"hostPort":      80, | ||||
| 				"containerPort": 80, | ||||
| 			}, | ||||
| 			"limits": map[string]interface{}{}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	if gpu > 0 { | ||||
| 		res, ok := extraContainer["resources"].(map[string]interface{}) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("unable to type check extraContainer") | ||||
| 		} | ||||
| 		reqs, ok := res["requests"].(map[string]interface{}) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("unable to type check extraContainer") | ||||
| 		} | ||||
| 		reqs[gpuManufacturer] = gpu | ||||
|  | ||||
| 		limits, ok := res["limits"].(map[string]interface{}) | ||||
| 		if !ok { | ||||
| 			return nil, errors.New("unable to type check extraContainer") | ||||
| 		} | ||||
| 		limits[gpuManufacturer] = gpu | ||||
|  | ||||
| 	} | ||||
| 	return extraContainer, err | ||||
| 	return extraContainer | ||||
| } | ||||
|  | ||||
| // startWorkspace starts a workspace and related resources. It assumes a DB record already exists | ||||
| @@ -441,6 +370,17 @@ func (c *Client) startWorkspace(namespace string, parameters []byte, workspace * | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	templates := argoTemplate.Spec.Templates | ||||
| 	for i, t := range templates { | ||||
| 		if t.Name == WorkspaceStatefulSetResource { | ||||
| 			resultManifest, err := c.addResourceRequestsAndLimitsToWorkspaceTemplate(t, argoTemplate, workspace) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			templates[i].Resource.Manifest = string(resultManifest) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	_, err = c.CreateWorkflowExecution(namespace, &WorkflowExecution{ | ||||
| 		Parameters: workspace.Parameters, | ||||
| 	}, workflowTemplate) | ||||
|   | ||||
| @@ -401,7 +401,7 @@ func createStatefulSetManifest(spec *WorkspaceSpec, config map[string]string, se | ||||
| 		env.PrependEnvVarToContainer(container, "ONEPANEL_DOMAIN", config["ONEPANEL_DOMAIN"]) | ||||
| 		env.PrependEnvVarToContainer(container, "ONEPANEL_PROVIDER", config["ONEPANEL_PROVIDER"]) | ||||
| 		env.PrependEnvVarToContainer(container, "ONEPANEL_RESOURCE_NAMESPACE", "{{workflow.namespace}}") | ||||
| 		env.PrependEnvVarToContainer(container, "ONEPANEL_RESOURCE_UID", "{{workflow.parameters.sys-name}}") | ||||
| 		env.PrependEnvVarToContainer(container, "ONEPANEL_RESOURCE_UID", "{{workflow.parameters.sys-uid}}") | ||||
|  | ||||
| 		for _, service := range services { | ||||
| 			envName := fmt.Sprintf("ONEPANEL_SERVICES_%v_API_URL", strings.ToUpper(service.Name)) | ||||
| @@ -541,7 +541,12 @@ func unmarshalWorkflowTemplate(spec *WorkspaceSpec, serviceManifest, virtualServ | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			volumeClaimItems = append(volumeClaimItems, wfv1.Item{Type: wfv1.String, StrVal: v.Name}) | ||||
| 			// We wrap the name in quotes as it has to be JSON friendly | ||||
| 			item, err := wfv1.ParseItem(`"` + v.Name + `"`) | ||||
| 			if err != nil { | ||||
| 				return "", err | ||||
| 			} | ||||
| 			volumeClaimItems = append(volumeClaimItems, item) | ||||
|  | ||||
| 			volumeClaimsMapped[v.Name] = true | ||||
| 		} | ||||
| @@ -1158,6 +1163,19 @@ func (c *Client) UpdateWorkspaceTemplate(namespace string, workspaceTemplate *Wo | ||||
| 	return workspaceTemplate, nil | ||||
| } | ||||
|  | ||||
| // UpdateWorkspaceTemplateManifest updates a workspace template by creating a new version where the only difference is the manifest | ||||
| func (c *Client) UpdateWorkspaceTemplateManifest(namespace, uid string, manifest string) (*WorkspaceTemplate, error) { | ||||
| 	existingTemplate, err := c.GetWorkspaceTemplate(namespace, uid, 0) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	existingTemplate.UID = uid | ||||
| 	existingTemplate.Manifest = manifest | ||||
|  | ||||
| 	return c.UpdateWorkspaceTemplate(namespace, existingTemplate) | ||||
| } | ||||
|  | ||||
| // ListWorkspaceTemplates returns a list of workspace templates that are not archived, sorted by most recent created first | ||||
| func (c *Client) ListWorkspaceTemplates(namespace string, request *request.Request) (workspaceTemplates []*WorkspaceTemplate, err error) { | ||||
| 	sb := c.workspaceTemplatesSelectBuilder(namespace). | ||||
|   | ||||
| @@ -2,9 +2,14 @@ package auth | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/md5" | ||||
| 	"encoding/hex" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"github.com/onepanelio/core/api" | ||||
| 	"github.com/onepanelio/core/pkg/util" | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| 	v12 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
|  | ||||
| @@ -27,6 +32,9 @@ const ( | ||||
| func getBearerToken(ctx context.Context) (*string, bool) { | ||||
| 	md, ok := metadata.FromIncomingContext(ctx) | ||||
| 	if !ok { | ||||
| 		log.WithFields(log.Fields{ | ||||
| 			"Method": "getBearerToken", | ||||
| 		}).Error("Unable to get metadata from incoming context") | ||||
| 		return nil, false | ||||
| 	} | ||||
|  | ||||
| @@ -36,6 +44,9 @@ func getBearerToken(ctx context.Context) (*string, bool) { | ||||
| 			return nil, false | ||||
| 		} | ||||
| 		t = strings.ReplaceAll(t, prefix, "") | ||||
| 		if t == "null" { | ||||
| 			return nil, false | ||||
| 		} | ||||
| 		return &t, true | ||||
| 	} | ||||
|  | ||||
| @@ -55,20 +66,36 @@ func getBearerToken(ctx context.Context) (*string, bool) { | ||||
| 		return &t, true | ||||
| 	} | ||||
|  | ||||
| 	log.WithFields(log.Fields{ | ||||
| 		"Method": "getBearerToken", | ||||
| 	}).Error("Unable to get BearerToken:", md) | ||||
|  | ||||
| 	return nil, false | ||||
| } | ||||
|  | ||||
| func getClient(ctx context.Context, kubeConfig *v1.Config, db *v1.DB, sysConfig v1.SystemConfig) (context.Context, error) { | ||||
| 	if kubeConfig == nil { | ||||
| 		return nil, fmt.Errorf("getClient - nil passed in for kubeConfig") | ||||
| 	} | ||||
| 	if db == nil { | ||||
| 		return nil, fmt.Errorf("getClient - nil passed in for db") | ||||
| 	} | ||||
|  | ||||
| 	bearerToken, ok := getBearerToken(ctx) | ||||
| 	if !ok { | ||||
| 		return nil, status.Error(codes.Unauthenticated, `Missing or invalid "authorization" header.`) | ||||
| 	} | ||||
| 	if bearerToken == nil { | ||||
| 		return nil, status.Error(codes.Unauthenticated, "Bearer token is nil") | ||||
| 	} | ||||
|  | ||||
| 	kubeConfig.BearerToken = *bearerToken | ||||
|  | ||||
| 	client, err := v1.NewClient(kubeConfig, db, sysConfig) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	client.Token = kubeConfig.BearerToken | ||||
|  | ||||
| 	return context.WithValue(ctx, ContextClientKey, client), nil | ||||
| } | ||||
| @@ -98,6 +125,43 @@ func IsAuthorized(c *v1.Client, namespace, verb, group, resource, name string) ( | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func verifyLogin(client *v1.Client, tokenRequest *api.GetAccessTokenRequest) (rawToken string, err error) { | ||||
| 	accountsList, err := client.CoreV1().ServiceAccounts("onepanel").List(v1.ListOptions{}) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	authTokenSecretName := "" | ||||
| 	for _, serviceAccount := range accountsList.Items { | ||||
| 		if serviceAccount.Name != tokenRequest.Username { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, secret := range serviceAccount.Secrets { | ||||
| 			if strings.Contains(secret.Name, "-token-") { | ||||
| 				authTokenSecretName = secret.Name | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if authTokenSecretName == "" { | ||||
| 		return "", util.NewUserError(codes.InvalidArgument, fmt.Sprintf("unknown service account '%v'", tokenRequest.Username)) | ||||
| 	} | ||||
|  | ||||
| 	secret, err := client.CoreV1().Secrets("onepanel").Get(authTokenSecretName, v12.GetOptions{}) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	currentTokenBytes := md5.Sum(secret.Data["token"]) | ||||
| 	currentTokenString := hex.EncodeToString(currentTokenBytes[:]) | ||||
|  | ||||
| 	if tokenRequest.Token != fmt.Sprintf("%s", currentTokenString) { | ||||
| 		return "", util.NewUserError(codes.InvalidArgument, "token doesn't match what's on record") | ||||
| 	} | ||||
|  | ||||
| 	return string(secret.Data["token"]), nil | ||||
| } | ||||
|  | ||||
| // UnaryInterceptor performs authentication checks. | ||||
| // The two main cases are: | ||||
| //   1. Is the token valid? This is used for logging in. | ||||
| @@ -105,6 +169,41 @@ func IsAuthorized(c *v1.Client, namespace, verb, group, resource, name string) ( | ||||
| func UnaryInterceptor(kubeConfig *v1.Config, db *v1.DB, sysConfig v1.SystemConfig) grpc.UnaryServerInterceptor { | ||||
| 	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { | ||||
| 		// Check if the provided token is valid. This does not require a token in the header. | ||||
| 		if info.FullMethod == "/api.AuthService/GetAccessToken" { | ||||
| 			md, ok := metadata.FromIncomingContext(ctx) | ||||
| 			if !ok { | ||||
| 				return resp, errors.New("unable to get metadata from incoming context") | ||||
| 			} | ||||
|  | ||||
| 			getAccessTokenRequest, ok := req.(*api.GetAccessTokenRequest) | ||||
| 			if !ok { | ||||
| 				return resp, errors.New("invalid request object for GetAccessTokenRequest") | ||||
| 			} | ||||
|  | ||||
| 			defaultClient, err := v1.GetDefaultClientWithDB(db) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			rawToken, err := verifyLogin(defaultClient, getAccessTokenRequest) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			sysConfig, err := defaultClient.GetSystemConfig() | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			md.Set("authorization", "Bearer "+rawToken) | ||||
|  | ||||
| 			ctx, err = getClient(ctx, kubeConfig, db, sysConfig) | ||||
| 			if err != nil { | ||||
| 				ctx = nil | ||||
| 			} | ||||
|  | ||||
| 			return handler(ctx, req) | ||||
| 		} | ||||
| 		if info.FullMethod == "/api.AuthService/IsValidToken" { | ||||
| 			md, ok := metadata.FromIncomingContext(ctx) | ||||
| 			if !ok { | ||||
| @@ -113,10 +212,29 @@ func UnaryInterceptor(kubeConfig *v1.Config, db *v1.DB, sysConfig v1.SystemConfi | ||||
|  | ||||
| 			tokenRequest, ok := req.(*api.IsValidTokenRequest) | ||||
| 			if !ok { | ||||
| 				return resp, errors.New("IsValidToken does not have correct request type") | ||||
| 				return resp, errors.New("invalid request object for GetAccessTokenRequest") | ||||
| 			} | ||||
| 			getAccessTokenRequest := &api.GetAccessTokenRequest{ | ||||
| 				Username: tokenRequest.Username, | ||||
| 				Token:    tokenRequest.Token, | ||||
| 			} | ||||
|  | ||||
| 			md.Set("authorization", tokenRequest.Token.Token) | ||||
| 			defaultClient, err := v1.GetDefaultClientWithDB(db) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			rawToken, err := verifyLogin(defaultClient, getAccessTokenRequest) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			sysConfig, err := defaultClient.GetSystemConfig() | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			md.Set("authorization", "Bearer "+rawToken) | ||||
|  | ||||
| 			ctx, err = getClient(ctx, kubeConfig, db, sysConfig) | ||||
| 			if err != nil { | ||||
|   | ||||
| @@ -50,13 +50,13 @@ func (a *AuthServer) IsAuthorized(ctx context.Context, request *api.IsAuthorized | ||||
| 	return res, nil | ||||
| } | ||||
|  | ||||
| func (a *AuthServer) IsValidToken(ctx context.Context, req *api.IsValidTokenRequest) (res *api.IsValidTokenResponse, err error) { | ||||
| // GetAccessToken is an alias for IsValidToken. It returns a token given a username and hashed token. | ||||
| func (a *AuthServer) GetAccessToken(ctx context.Context, req *api.GetAccessTokenRequest) (res *api.GetAccessTokenResponse, err error) { | ||||
| 	if ctx == nil { | ||||
| 		return nil, status.Error(codes.Unauthenticated, "Unauthenticated.") | ||||
| 		return nil, status.Error(codes.Unauthenticated, "unauthenticated") | ||||
| 	} | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
|  | ||||
| 	err = a.isValidToken(err, client) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -66,10 +66,51 @@ func (a *AuthServer) IsValidToken(ctx context.Context, req *api.IsValidTokenRequ | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	res = &api.IsValidTokenResponse{} | ||||
| 	res.Domain = config["ONEPANEL_DOMAIN"] | ||||
|  | ||||
| 	return res, nil | ||||
| 	domain := config.Domain() | ||||
| 	if domain == nil { | ||||
| 		return nil, fmt.Errorf("domain is not set") | ||||
| 	} | ||||
|  | ||||
| 	res = &api.GetAccessTokenResponse{ | ||||
| 		Domain:      *domain, | ||||
| 		AccessToken: client.Token, | ||||
| 		Username:    req.Username, | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // IsValidToken returns the appropriate token information given an md5 version of the token | ||||
| // Deprecated: Use GetAccessToken instead | ||||
| func (a *AuthServer) IsValidToken(ctx context.Context, req *api.IsValidTokenRequest) (res *api.IsValidTokenResponse, err error) { | ||||
| 	if ctx == nil { | ||||
| 		return nil, status.Error(codes.Unauthenticated, "unauthenticated") | ||||
| 	} | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
| 	err = a.isValidToken(err, client) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	config, err := client.GetSystemConfig() | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	domain := config.Domain() | ||||
| 	if domain == nil { | ||||
| 		return nil, fmt.Errorf("domain is not set") | ||||
| 	} | ||||
|  | ||||
| 	res = &api.IsValidTokenResponse{ | ||||
| 		Domain:   *domain, | ||||
| 		Token:    client.Token, | ||||
| 		Username: req.Username, | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (a *AuthServer) isValidToken(err error, client *v1.Client) error { | ||||
|   | ||||
| @@ -37,6 +37,65 @@ func MappingToKeyValue(mapping map[string]string) []*api.KeyValue { | ||||
| 	return keyValues | ||||
| } | ||||
|  | ||||
| // MetricsToAPI converts Metrics to the API version | ||||
| func MetricsToAPI(metrics v1.Metrics) []*api.Metric { | ||||
| 	result := make([]*api.Metric, 0) | ||||
|  | ||||
| 	for _, metric := range metrics { | ||||
| 		newItem := &api.Metric{ | ||||
| 			Name:   metric.Name, | ||||
| 			Value:  metric.Value, | ||||
| 			Format: metric.Format, | ||||
| 		} | ||||
|  | ||||
| 		result = append(result, newItem) | ||||
| 	} | ||||
|  | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| // APIMetricsToCore converts []*api.Metric to v1.Metrics | ||||
| func APIMetricsToCore(metrics []*api.Metric) v1.Metrics { | ||||
| 	result := v1.Metrics{} | ||||
|  | ||||
| 	for _, metric := range metrics { | ||||
| 		m := v1.Metric{ | ||||
| 			Name:   metric.Name, | ||||
| 			Value:  metric.Value, | ||||
| 			Format: metric.Format, | ||||
| 		} | ||||
|  | ||||
| 		// We don't override anything because we want the input to match how the user entered it | ||||
| 		// So if there are entries with the same name, that's fine. | ||||
| 		result.Add(&m, false) | ||||
| 	} | ||||
|  | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| // LabelsToKeyValues converts []*v1.Label to []*api.Label | ||||
| func LabelsToKeyValues(labels []*v1.Label) []*api.KeyValue { | ||||
| 	keyValues := make([]*api.KeyValue, 0) | ||||
|  | ||||
| 	for _, label := range labels { | ||||
| 		keyValues = append(keyValues, LabelToKeyValue(label)) | ||||
| 	} | ||||
|  | ||||
| 	sort.Slice(keyValues, func(i, j int) bool { | ||||
| 		return keyValues[i].Key < keyValues[j].Key | ||||
| 	}) | ||||
|  | ||||
| 	return keyValues | ||||
| } | ||||
|  | ||||
| // LabelToKeyValue converts a *v1.Label to *api.Label | ||||
| func LabelToKeyValue(label *v1.Label) *api.KeyValue { | ||||
| 	return &api.KeyValue{ | ||||
| 		Key:   label.Key, | ||||
| 		Value: label.Value, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ParameterOptionToAPI(option *v1.ParameterOption) *api.ParameterOption { | ||||
| 	apiOption := &api.ParameterOption{ | ||||
| 		Name:  option.Name, | ||||
|   | ||||
| @@ -5,23 +5,25 @@ import ( | ||||
| 	"github.com/onepanelio/core/api" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"github.com/onepanelio/core/server/auth" | ||||
| 	"github.com/onepanelio/core/server/converter" | ||||
| ) | ||||
|  | ||||
| func resourceIdentifierToArgoResource(identifier string) string { | ||||
| func getGroupAndResourceByIdentifier(identifier string) (group, resource string) { | ||||
| 	group = "argoproj.io" | ||||
| 	switch identifier { | ||||
| 	case v1.TypeWorkflowTemplate: | ||||
| 		return "workflowtemplates" | ||||
| 		return group, "workflowtemplates" | ||||
| 	case v1.TypeWorkflowTemplateVersion: | ||||
| 		return "workflowtemplates" | ||||
| 		return group, "workflowtemplates" | ||||
| 	case v1.TypeWorkflowExecution: | ||||
| 		return "workflows" | ||||
| 		return group, "workflows" | ||||
| 	case v1.TypeCronWorkflow: | ||||
| 		return "cronworkflows" | ||||
| 		return group, "cronworkflows" | ||||
| 	case v1.TypeWorkspace: | ||||
| 		return "statefulset" | ||||
| 		return "onepanel.io", "workspaces" | ||||
| 	} | ||||
|  | ||||
| 	return "" | ||||
| 	return "", "" | ||||
| } | ||||
|  | ||||
| func mapLabelsToKeyValue(labels []*v1.Label) []*api.KeyValue { | ||||
| @@ -54,10 +56,10 @@ func NewLabelServer() *LabelServer { | ||||
| } | ||||
|  | ||||
| func (s *LabelServer) GetLabels(ctx context.Context, req *api.GetLabelsRequest) (*api.GetLabelsResponse, error) { | ||||
| 	argoResource := resourceIdentifierToArgoResource(req.Resource) | ||||
| 	group, resource := getGroupAndResourceByIdentifier(req.Resource) | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "get", "argoproj.io", argoResource, "") | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "get", group, resource, "") | ||||
| 	if err != nil || !allowed { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -73,10 +75,10 @@ func (s *LabelServer) GetLabels(ctx context.Context, req *api.GetLabelsRequest) | ||||
| } | ||||
|  | ||||
| func (s *LabelServer) AddLabels(ctx context.Context, req *api.AddLabelsRequest) (*api.GetLabelsResponse, error) { | ||||
| 	argoResource := resourceIdentifierToArgoResource(req.Resource) | ||||
| 	group, resource := getGroupAndResourceByIdentifier(req.Resource) | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "create", "argoproj.io", argoResource, "") | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "create", group, resource, "") | ||||
| 	if err != nil || !allowed { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -97,10 +99,10 @@ func (s *LabelServer) AddLabels(ctx context.Context, req *api.AddLabelsRequest) | ||||
| } | ||||
|  | ||||
| func (s *LabelServer) ReplaceLabels(ctx context.Context, req *api.ReplaceLabelsRequest) (*api.GetLabelsResponse, error) { | ||||
| 	argoResource := resourceIdentifierToArgoResource(req.Resource) | ||||
| 	group, resource := getGroupAndResourceByIdentifier(req.Resource) | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "update", "argoproj.io", argoResource, "") | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "update", group, resource, "") | ||||
| 	if err != nil || !allowed { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -121,11 +123,11 @@ func (s *LabelServer) ReplaceLabels(ctx context.Context, req *api.ReplaceLabelsR | ||||
| } | ||||
|  | ||||
| func (s *LabelServer) DeleteLabel(ctx context.Context, req *api.DeleteLabelRequest) (*api.GetLabelsResponse, error) { | ||||
| 	argoResource := resourceIdentifierToArgoResource(req.Resource) | ||||
| 	group, resource := getGroupAndResourceByIdentifier(req.Resource) | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
| 	// update verb here since we are not deleting the resource, but labels | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "update", "argoproj.io", argoResource, "") | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "update", group, resource, "") | ||||
| 	if err != nil || !allowed { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -146,3 +148,29 @@ func (s *LabelServer) DeleteLabel(ctx context.Context, req *api.DeleteLabelReque | ||||
| 		Labels: mapLabelsToKeyValue(labels), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| // GetAvailableLabels returns the labels available for a resource specified by the GetAvailableLabelsRequest | ||||
| func (s *LabelServer) GetAvailableLabels(ctx context.Context, req *api.GetAvailableLabelsRequest) (*api.GetLabelsResponse, error) { | ||||
| 	group, resource := getGroupAndResourceByIdentifier(req.Resource) | ||||
|  | ||||
| 	client := getClient(ctx) | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "get", group, resource, "") | ||||
| 	if err != nil || !allowed { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	labels, err := client.ListAvailableLabels(&v1.SelectLabelsQuery{ | ||||
| 		Table:     v1.TypeToTableName(req.Resource), | ||||
| 		Alias:     "l", | ||||
| 		Namespace: req.Namespace, | ||||
| 		KeyLike:   req.KeyLike + "%", | ||||
| 		Skip:      v1.SkipKeysFromString(req.SkipKeys), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return &api.GetLabelsResponse{ | ||||
| 		Labels: converter.LabelsToKeyValues(labels), | ||||
| 	}, nil | ||||
| } | ||||
|   | ||||
| @@ -40,6 +40,7 @@ func apiWorkflowExecution(wf *v1.WorkflowExecution, router router.Web) (workflow | ||||
| 		Phase:     string(wf.Phase), | ||||
| 		Manifest:  wf.Manifest, | ||||
| 		Labels:    converter.MappingToKeyValue(wf.Labels), | ||||
| 		Metrics:   converter.MetricsToAPI(wf.Metrics), | ||||
| 	} | ||||
|  | ||||
| 	if wf.StartedAt != nil && !wf.StartedAt.IsZero() { | ||||
| @@ -143,8 +144,7 @@ func (s *WorkflowServer) AddWorkflowExecutionStatistics(ctx context.Context, req | ||||
| 		return &empty.Empty{}, err | ||||
| 	} | ||||
|  | ||||
| 	err = client.FinishWorkflowExecutionStatisticViaExitHandler(req.Namespace, req.Uid, | ||||
| 		req.Statistics.WorkflowTemplateId, phase, workflow.Status.StartedAt.UTC()) | ||||
| 	err = client.FinishWorkflowExecutionStatisticViaExitHandler(req.Namespace, req.Uid, phase, workflow.Status.StartedAt.UTC()) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return &empty.Empty{}, err | ||||
| @@ -468,3 +468,37 @@ func (s *WorkflowServer) GetWorkflowExecutionStatisticsForNamespace(ctx context. | ||||
| 		Stats: converter.WorkflowExecutionStatisticsReportToAPI(report), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| // AddWorkflowExecutionMetrics merges the input metrics for the workflow execution identified by (namespace,uid) | ||||
| func (s *WorkflowServer) AddWorkflowExecutionMetrics(ctx context.Context, req *api.AddWorkflowExecutionsMetricsRequest) (*api.WorkflowExecutionsMetricsResponse, error) { | ||||
| 	client := getClient(ctx) | ||||
|  | ||||
| 	metrics := converter.APIMetricsToCore(req.Metrics) | ||||
| 	workflowExecution, err := client.AddWorkflowExecutionMetrics(req.Namespace, req.Uid, metrics, req.Override) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp := &api.WorkflowExecutionsMetricsResponse{ | ||||
| 		Metrics: converter.MetricsToAPI(workflowExecution.Metrics), | ||||
| 	} | ||||
|  | ||||
| 	return resp, nil | ||||
| } | ||||
|  | ||||
| // UpdateWorkflowExecutionMetrics replaces the metrics with the input metrics for the workflow identified by (namespace, uid) | ||||
| func (s *WorkflowServer) UpdateWorkflowExecutionMetrics(ctx context.Context, req *api.UpdateWorkflowExecutionsMetricsRequest) (*api.WorkflowExecutionsMetricsResponse, error) { | ||||
| 	client := getClient(ctx) | ||||
|  | ||||
| 	metrics := converter.APIMetricsToCore(req.Metrics) | ||||
| 	workflowExecution, err := client.UpdateWorkflowExecutionMetrics(req.Namespace, req.Uid, metrics) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp := &api.WorkflowExecutionsMetricsResponse{ | ||||
| 		Metrics: converter.MetricsToAPI(workflowExecution.Metrics), | ||||
| 	} | ||||
|  | ||||
| 	return resp, nil | ||||
| } | ||||
|   | ||||
| @@ -43,6 +43,7 @@ func apiWorkflowTemplate(wft *v1.WorkflowTemplate) *api.WorkflowTemplate { | ||||
| 	return res | ||||
| } | ||||
|  | ||||
| // CreateWorkflowTemplate creates a workflow template and the initial version | ||||
| func (s *WorkflowTemplateServer) CreateWorkflowTemplate(ctx context.Context, req *api.CreateWorkflowTemplateRequest) (*api.WorkflowTemplate, error) { | ||||
| 	client := getClient(ctx) | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "create", "argoproj.io", "workflowtemplates", "") | ||||
|   | ||||
| @@ -363,7 +363,7 @@ func (s *WorkspaceServer) RetryLastWorkspaceAction(ctx context.Context, req *api | ||||
| func (s *WorkspaceServer) GetWorkspaceStatisticsForNamespace(ctx context.Context, req *api.GetWorkspaceStatisticsForNamespaceRequest) (*api.GetWorkspaceStatisticsForNamespaceResponse, error) { | ||||
| 	client := getClient(ctx) | ||||
|  | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "list", "argoproj.io", "workspaces", "") | ||||
| 	allowed, err := auth.IsAuthorized(client, req.Namespace, "list", "onepanel.io", "workspaces", "") | ||||
| 	if err != nil || !allowed { | ||||
| 		return nil, err | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user