mirror of
				https://github.com/onepanelio/onepanel.git
				synced 2025-11-01 01:02:32 +08:00 
			
		
		
		
	Compare commits
	
		
			724 Commits
		
	
	
		
			v0.8.0
			...
			v0.13.1-rc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0e1e48dfc8 | ||
|   | dd0f1f7705 | ||
|   | 03f8f47664 | ||
|   | c85496d216 | ||
|   | 5f6415548d | ||
|   | c641c17a8c | ||
|   | 83a2543b13 | ||
|   | e8dae0f2e9 | ||
|   | b85bf4d688 | ||
|   | 7fe0ab2654 | ||
|   | dfa6eb2fe6 | ||
|   | cc2c51ace5 | ||
|   | 897462ede7 | ||
|   | 4e3c24fd89 | ||
|   | 276e105f20 | ||
|   | 656026ac84 | ||
|   | 95bea11e43 | ||
|   | c6f65510d8 | ||
|   | d6e279dde5 | ||
|   | e99b0e943d | ||
|   | 22a7c31f1d | ||
|   | b6c0f24170 | ||
|   | 9c04ee066d | ||
|   | 29c3e808e1 | ||
|   | 3ded40a477 | ||
|   | 559d52b033 | ||
|   | 0ea527ec0a | ||
|   | 1a67e07d20 | ||
|   | 49b9bc4f93 | ||
|   | 4def4aa529 | ||
|   | 5d114e1d27 | ||
|   | 1ed3b3e740 | ||
|   | 571de0b40e | ||
|   | 463a8eea60 | ||
|   | 5105ad373a | ||
|   | afa675dc28 | ||
|   | 335301396e | ||
|   | 995b1171e6 | ||
|   | d497058f20 | ||
|   | 63bcd60d84 | ||
|   | ecf0a82a62 | ||
|   | f31c998349 | ||
|   | b6e5626a19 | ||
|   | 77ca0939e4 | ||
|   | 83a4238153 | ||
|   | 77716ba56b | ||
|   | 541747d232 | ||
|   | 0956afdabe | ||
|   | 8b4a70d958 | ||
|   | 91b97d9243 | ||
|   | be62f41e20 | ||
|   | 5fa34f7870 | ||
|   | 65f49113a8 | ||
|   | 8a874ec3f2 | ||
|   | ada6cfd413 | ||
|   | e7cef240c4 | ||
|   | 1b7e96cab9 | ||
|   | dca6db842c | ||
|   | f7770618ca | ||
|   | bafd371e11 | ||
|   | 274a1c2e84 | ||
|   | 77812419d2 | ||
|   | 6fa123b122 | ||
|   | b1d0ab1d59 | ||
|   | 0d5cd95ccb | ||
|   | 9d7172c920 | ||
|   | d04c17eee1 | ||
|   | 78269c2b2c | ||
|   | 3e17318512 | ||
|   | 011fcc590e | ||
|   | c45231c106 | ||
|   | 9ec45e4f34 | ||
|   | 48e2050e97 | ||
|   | 478b9a1c76 | ||
|   | d42f88e04c | ||
|   | 6dd7c0ac70 | ||
|   | 31076bc70d | ||
|   | 7bbb57ca09 | ||
|   | 7b404ff0b6 | ||
|   | aaf20b4ab6 | ||
|   | 3e87376feb | ||
|   | 7bc1056bc6 | ||
|   | 880e8ba082 | ||
|   | ec634b66ca | ||
|   | 15fc40a3e9 | ||
|   | 96747f1dc0 | ||
|   | b7395a1ffa | ||
|   | a5f34b4f3b | ||
|   | a28b5101fd | ||
|   | 688302c58e | ||
|   | 49e19eb135 | ||
|   | 0a676dff6f | ||
|   | d524c3cb66 | ||
|   | a9953683a9 | ||
|   | d4d4884e5b | ||
|   | d29290945c | ||
|   | 3343f2f74b | ||
|   | 837291a52a | ||
|   | 122593fdbe | ||
|   | cd40edb16a | ||
|   | b27ca42e42 | ||
|   | 3af4273541 | ||
|   | 197fb06f4c | ||
|   | 0b6a6e0af3 | ||
|   | ba3c2e22a9 | ||
|   | 5955876c49 | ||
|   | 767643a51a | ||
|   | 5100efdd2d | ||
|   | a5e358ea61 | ||
|   | a3ef3d410a | ||
|   | c270283c42 | ||
|   | 2093b565eb | ||
|   | 0b4b5c8050 | ||
|   | 1781e2774d | ||
|   | d87e6e49db | ||
|   | a1c58477bd | ||
|   | f90b45437a | ||
|   | 85fb89862b | ||
|   | c30f48811d | ||
|   | 0170252659 | ||
|   | 498eed6aca | ||
|   | e01842c922 | ||
|   | 8f12351761 | ||
|   | a22bdcc6f5 | ||
|   | 766815da1f | ||
|   | a84d74d256 | ||
|   | 6e6b70aeb7 | ||
|   | a78138c562 | ||
|   | 6167d5ef65 | ||
|   | ce52f9914e | ||
|   | ed54cb9a3f | ||
|   | fc7ef5ffac | ||
|   | 1c16a5e743 | ||
|   | 9b25fd4190 | ||
|   | 076422e8ac | ||
|   | 5464dc71ac | ||
|   | 3a0af4c727 | ||
|   | f4879a4228 | ||
|   | 4135b86928 | ||
|   | ac51146dbc | ||
|   | 575dbc1507 | ||
|   | 8810b2c226 | ||
|   | 95cc0c3622 | ||
|   | 48a68083dc | ||
|   | 029469e031 | ||
|   | c2d665ac8b | ||
|   | 0fff409d0f | ||
|   | abf301093e | ||
|   | 91b79a1d33 | ||
|   | c92781b5c8 | ||
|   | 858c299604 | ||
|   | 94a91fc543 | ||
|   | 18a7c3fa99 | ||
|   | 06fe267366 | ||
|   | 35e4d1fc5b | ||
|   | b54e464c4a | ||
|   | 735baac10d | ||
|   | edd1d474b1 | ||
|   | 150da5654b | ||
|   | ee67c8713b | ||
|   | 4a16b4e031 | ||
|   | 0e3626b25a | ||
|   | 597a03ffc2 | ||
|   | 88595d6b4c | ||
|   | f1bbd0e884 | ||
|   | 4ee679cf9f | ||
|   | 26b6e045de | ||
|   | 4a3a754585 | ||
|   | 4543c84170 | ||
|   | b2a70c46d3 | ||
|   | 3ede228aa9 | ||
|   | 4a67aa103f | ||
|   | 4129466236 | ||
|   | 79b3ed6a49 | ||
|   | 853c50dea2 | ||
|   | f23aa928d8 | ||
|   | a1872b8554 | ||
|   | 99c42034b7 | ||
|   | 5e5f6bd51b | ||
|   | a33c18c479 | ||
|   | e882d4270f | ||
|   | 86fc90cd6b | ||
|   | 4a93177b5c | ||
|   | 7239e6620b | ||
|   | cbecaf6fa1 | ||
|   | de7f060c81 | ||
|   | c723a3270f | ||
|   | 24bb7cb0a5 | ||
|   | a51d4b662e | ||
|   | 6e72b550b1 | ||
|   | 1f95b87699 | ||
|   | 8258c5f19b | ||
|   | e61341c50a | ||
|   | 8c0a763404 | ||
|   | 76bc226a2e | ||
|   | e1dd4b8ed1 | ||
|   | 1e3b9ca278 | ||
|   | cde5b54830 | ||
|   | d2adb109e1 | ||
|   | 6eac7f2c74 | ||
|   | 9e4eb59cec | ||
|   | 0ccd871e54 | ||
|   | 4bb205257a | ||
|   | bbbf1c0d6a | ||
|   | f9b23a7d2a | ||
|   | 53c88c8390 | ||
|   | b7e4281eeb | ||
|   | f533ce01b3 | ||
|   | abba7b5476 | ||
|   | 96861e19d3 | ||
|   | f797e93821 | ||
|   | e5586fcf76 | ||
|   | 93d1b4a2c0 | ||
|   | df1421c6c4 | ||
|   | cfbd92b65f | ||
|   | bd5bea5f3a | ||
|   | 5d3345ded2 | ||
|   | 0274785f72 | ||
|   | bcec3c13fd | ||
|   | 62b3e64df5 | ||
|   | 7c6708849f | ||
|   | 811f86633a | ||
|   | 4ed14f9baf | ||
|   | c0ad80a185 | ||
|   | 9e694f1c34 | ||
|   | 4e92586024 | ||
|   | b62271ddba | ||
|   | d1a119b6de | ||
|   | 5a66ef2673 | ||
|   | eabd391180 | ||
|   | 0736c92804 | ||
|   | 93551f12ee | ||
|   | 9cb3002cee | ||
|   | eb9d798021 | ||
|   | a31082d9a1 | ||
|   | 865f3fa827 | ||
|   | 072cbf24e3 | ||
|   | 90ce50a9ac | ||
|   | 00806b9baf | ||
|   | ce805bfa20 | ||
|   | 1431b4344b | ||
|   | 9558473f2c | ||
|   | bc7ce21fb6 | ||
|   | e222af5564 | ||
|   | 2abe166904 | ||
|   | 4b4cccbd74 | ||
|   | eb06f0ada3 | ||
|   | 6b74d0c61b | ||
|   | d41dad0074 | ||
|   | 34f440587f | ||
|   | 70a4fc9eb8 | ||
|   | cd7f4cb5d7 | ||
|   | 6a681e6693 | ||
|   | 036e417a56 | ||
|   | 879932c4b5 | ||
|   | 3c3a514983 | ||
|   | 8586639a6c | ||
|   | 55eeb90e2a | ||
|   | c81c2d7672 | ||
|   | 2f5720aefc | ||
|   | f02e7791f7 | ||
|   | 8dc22ff9bc | ||
|   | 6edca5731b | ||
|   | 63bdb69968 | ||
|   | b2e887c1c9 | ||
|   | 88d23a5ec5 | ||
|   | 97ac5892ab | ||
|   | 18a8164b8e | ||
|   | 2d5db5baa1 | ||
|   | c30196f267 | ||
|   | 7af2e5b1db | ||
|   | 5e4bbaaf9b | ||
|   | e826167aa5 | ||
|   | 6863fd8d99 | ||
|   | aed10dc1c9 | ||
|   | 20c23cfb8e | ||
|   | 4cdb39f934 | ||
|   | 10204a8896 | ||
|   | 3e6a48ba1e | ||
|   | aeaa447beb | ||
|   | 023713da32 | ||
|   | 8a58fb9705 | ||
|   | 54d5420838 | ||
|   | ebfcf1fb31 | ||
|   | 10fb88639c | ||
|   | b020efb16f | ||
|   | 85e876b723 | ||
|   | 080c667b05 | ||
|   | fc89727b80 | ||
|   | 9b90391892 | ||
|   | e99e66590a | ||
|   | a8f287b197 | ||
|   | 7e63fa28d0 | ||
|   | 7e41f5e538 | ||
|   | 77080ff173 | ||
|   | 8ca18d5fc5 | ||
|   | 4b7d7a1932 | ||
|   | e244b8e625 | ||
|   | 819c57bed1 | ||
|   | eeaad9c03b | ||
|   | 6ca2977662 | ||
|   | 6dd0225e17 | ||
|   | a26c83988b | ||
|   | 80ed85a4cb | ||
|   | e0f8118241 | ||
|   | da1ca6eece | ||
|   | b239ca1e6f | ||
|   | b2bef450e1 | ||
|   | 08442a796f | ||
|   | 206e6a48cd | ||
|   | 276708d83c | ||
|   | 9c8299d89c | ||
|   | 828e44ab7d | ||
|   | 98a45f927f | ||
|   | c97737773e | ||
|   | 57f228ec2c | ||
|   | f421ba4ab8 | ||
|   | 6d9a575789 | ||
|   | 0a6ea236c7 | ||
|   | fa2a351da3 | ||
|   | 7ff17a5aae | ||
|   | 8d8472f52d | ||
|   | 12d3e84943 | ||
|   | 6f65f291d5 | ||
|   | ac5a394366 | ||
|   | 5b0fc82acf | ||
|   | 39c9511578 | ||
|   | 5d221f6140 | ||
|   | da8cb2859a | ||
|   | 5009a2643f | ||
|   | e0ec2e5783 | ||
|   | 11d198a2db | ||
|   | 9ab76e78fb | ||
|   | 859a3d21c9 | ||
|   | 512bb04be5 | ||
|   | 00c22974a9 | ||
|   | 2bb66545e8 | ||
|   | b0ec3194b6 | ||
|   | 81e3a7f299 | ||
|   | a913c69b71 | ||
|   | 16c04a9906 | ||
|   | 013b41f102 | ||
|   | 4d5f02c815 | ||
|   | c1a22cd330 | ||
|   | 25049535e3 | ||
|   | 2f8735c6d0 | ||
|   | 276f084fab | ||
|   | 8e9e51fc5e | ||
|   | f9838a4614 | ||
|   | 36a5d26b4e | ||
|   | e12cdafac2 | ||
|   | e851a35b4e | ||
|   | d0a83ffddd | ||
|   | 29710519a1 | ||
|   | c05ac10c64 | ||
|   | 43a9c22d40 | ||
|   | 2eec349af9 | ||
|   | f81cdc03f7 | ||
|   | 1276e82fb0 | ||
|   | 8bfcb87e91 | ||
|   | 30e25192c7 | ||
|   | cb4a229984 | ||
|   | c3f76f971c | ||
|   | dc27fd3319 | ||
|   | 0a8744656c | ||
|   | 1910a47a21 | ||
|   | e3fd781cd3 | ||
|   | 5eff42fb2c | ||
|   | 3067c62a7f | ||
|   | adb7f0b74a | ||
|   | 6753ead9f8 | ||
|   | 146411c370 | ||
|   | bdc3d99fed | ||
|   | aa6725fbc9 | ||
|   | 8da35695de | ||
|   | fc7cdb5681 | ||
|   | 7bbeba544d | ||
|   | 5b7f5c9724 | ||
|   | 1effb919d6 | ||
|   | 7f6f58884a | ||
|   | 16274dd946 | ||
|   | cebb412175 | ||
|   | 5dbb2104ce | ||
|   | 2232d4e946 | ||
|   | e66c095500 | ||
|   | 7af3c9dd7c | ||
|   | b01c0c41a8 | ||
|   | 59d0c95307 | ||
|   | d319d41929 | ||
|   | 9435404701 | ||
|   | b6b8652829 | ||
|   | 5073cbdff1 | ||
|   | 0b77438d57 | ||
|   | 59e7d58503 | ||
|   | fa96d6ef66 | ||
|   | 6c0d3fe598 | ||
|   | b0361cdc6c | ||
|   | e526505365 | ||
|   | 993ce397aa | ||
|   | 7a8df485ad | ||
|   | 7936eac98d | ||
|   | 94ae9071aa | ||
|   | 8b6d10d112 | ||
|   | a94ae526ca | ||
|   | 8e2b1ab106 | ||
|   | e83e5d495e | ||
|   | 0f5cf7be4d | ||
|   | 7295ba36b3 | ||
|   | a8958b0136 | ||
|   | 69a6a72303 | ||
|   | 92f2be7cac | ||
|   | 46f4465103 | ||
|   | ca45e29dd5 | ||
|   | dfd892d6f1 | ||
|   | c1d123ec2c | ||
|   | 7c2001f5ac | ||
|   | aff166fb40 | ||
|   | 40759738ae | ||
|   | a0454cdfc3 | ||
|   | 41d3d7be34 | ||
|   | 4dc60c2113 | ||
|   | 3cf11eaa58 | ||
|   | 3b605545b1 | ||
|   | eef3309080 | ||
|   | 4e3eaae1f6 | ||
|   | 2ddab18a59 | ||
|   | 6727b00b05 | ||
|   | 81c05f9954 | ||
|   | ac5bf65ae9 | ||
|   | 66431a21eb | ||
|   | 8d662d6ce0 | ||
|   | ad16285fd4 | ||
|   | f024889ca8 | ||
|   | d7df089d31 | ||
|   | 2cd3f76299 | ||
|   | 965e8dda92 | ||
|   | c13c868143 | ||
|   | e2f94e937c | ||
|   | df74766a66 | ||
|   | 30305f42e1 | ||
|   | 41b2f322da | ||
|   | 946ab11dab | ||
|   | 886e39244e | ||
|   | 7ce8d9cdfa | ||
|   | 2868ab69c9 | ||
|   | 18428c4e82 | ||
|   | df3dba4e2e | ||
|   | d097cdfefe | ||
|   | cee49e67f4 | ||
|   | 640c7b54f5 | ||
|   | 655020b54b | ||
|   | 5117c8b34e | ||
|   | 045912fe5c | ||
|   | 3673b3da59 | ||
|   | d7db598cc6 | ||
|   | f3a2856d65 | ||
|   | f1045710a0 | ||
|   | ed621633df | ||
|   | c5d1ec9b1f | ||
|   | 5c225b405d | ||
|   | bd5ec0e7c2 | ||
|   | 176fcc3008 | ||
|   | 945b3bc2e5 | ||
|   | 1bdd6a7eda | ||
|   | f78ae63afa | ||
|   | 114f290cde | ||
|   | 1a15df4999 | ||
|   | f9f6d75be8 | ||
|   | 782617a3e9 | ||
|   | 0ec109da2b | ||
|   | b8b9ff2543 | ||
|   | 0b54bd1c43 | ||
|   | cb27809665 | ||
|   | 252e53a793 | ||
|   | 05fc2b1422 | ||
|   | 839b9ac2e3 | ||
|   | 2091485345 | ||
|   | 0ffa3aee32 | ||
|   | a5cc3cf38a | ||
|   | 4bad6b8858 | ||
|   | 35982bf85a | ||
|   | f1b31c7d3d | ||
|   | ec2f9b3ecd | ||
|   | a2c11050fc | ||
|   | b3f9c44482 | ||
|   | 8aa10c9630 | ||
|   | 6c8f6cee5b | ||
|   | 60bfe4e02a | ||
|   | 9e022b24f7 | ||
|   | be63c412be | ||
|   | df582292b7 | ||
|   | 636f7cc72f | ||
|   | b8912d4f4a | ||
|   | 2b8c2b4589 | ||
|   | c98d1d5614 | ||
|   | 88f6ba2fb8 | ||
|   | 71ce7289fd | ||
|   | 62f53ee605 | ||
|   | 81241b0cc9 | ||
|   | 90602b8f87 | ||
|   | ff2e948623 | ||
|   | a831ed164d | ||
|   | 22bcd5f838 | ||
|   | 21ab9cab01 | ||
|   | 2daf7f8c72 | ||
|   | 3d1382ba17 | ||
|   | 51a76523d3 | ||
|   | 6b08cd3233 | ||
|   | 2a499f228a | ||
|   | 2c0279eba1 | ||
|   | cc7ec322b3 | ||
|   | 882901facb | ||
|   | c59c3f2492 | ||
|   | 3384564c42 | ||
|   | e22056876e | ||
|   | b7bd16610c | ||
|   | fe5a071b61 | ||
|   | 50e6e83a16 | ||
|   | bd49e64b78 | ||
|   | 90003fa2d9 | ||
|   | 1440a660ef | ||
|   | 925d278163 | ||
|   | 5a13be299f | ||
|   | 3d5dcb632a | ||
|   | 5620bfb3fb | ||
|   | dea5eeda3b | ||
|   | 1cf4dd6658 | ||
|   | d079d5bad8 | ||
|   | 0d738fe2ad | ||
|   | 8cf8436afc | ||
|   | ab9627f249 | ||
|   | a0197e0883 | ||
|   | 97c5e2da6f | ||
|   | 817ec61bdf | ||
|   | c56a1c0e96 | ||
|   | 441722a8ba | ||
|   | ec32dc825c | ||
|   | 9f5b12da69 | ||
|   | 1526194e71 | ||
|   | 017c3ca899 | ||
|   | 7887f3a4ef | ||
|   | d209423100 | ||
|   | 1e3a5d4faf | ||
|   | f6a7d3ec58 | ||
|   | ef9c185977 | ||
|   | c7184d133e | ||
|   | ec2ad1a9be | ||
|   | 640d4f6e9f | ||
|   | 027a93f044 | ||
|   | 5fe3ef9213 | ||
|   | 49c1c6a0cd | ||
|   | ce9fd4bf52 | ||
|   | e1ade14d6c | ||
|   | d823a951fb | ||
|   | 9e236aafb2 | ||
|   | aaf6d31847 | ||
|   | efffe1f070 | ||
|   | 6fe23c7ed8 | ||
|   | 8684e44632 | ||
|   | 8c8d4e237a | ||
|   | 0e2eb1580e | ||
|   | 72d6892276 | ||
|   | 24348647a8 | ||
|   | d736e773ca | ||
|   | fddf2d6a81 | ||
|   | 7df9ac6240 | ||
|   | 7ddd6873ea | ||
|   | 63011e1ab4 | ||
|   | b6c67dd774 | ||
|   | c91efc7a60 | ||
|   | b6b8d624d1 | ||
|   | 504c4bf597 | ||
|   | f19d3b4e53 | ||
|   | c657a004f0 | ||
|   | 3253aac814 | ||
|   | 57502417ad | ||
|   | 56777b48c3 | ||
|   | 3074622046 | ||
|   | ba72b1435f | ||
|   | d56b728995 | ||
|   | d213fda778 | ||
|   | a983e26b92 | ||
|   | 9f6a1be08e | ||
|   | 9c356dfd8b | ||
|   | 814b289024 | ||
|   | ee9cf10667 | ||
|   | 5b69516867 | ||
|   | 0c28cc1576 | ||
|   | 7cddeb9311 | ||
|   | 64a078f4d6 | ||
|   | 3f4d84398b | ||
|   | 5ecd8ca185 | ||
|   | 73e7cda6f1 | ||
|   | 9af50d36b3 | ||
|   | 0e9ec72527 | ||
|   | b8191f6b1f | ||
|   | 5f6b995564 | ||
|   | beb867eb22 | ||
|   | cd8298b654 | ||
|   | c4d9c8b9a8 | ||
|   | 6e1a3729f2 | ||
|   | 483c79abb3 | ||
|   | 79d5babfcb | ||
|   | 322265dce2 | ||
|   | 3079bbf0be | ||
|   | 78a9b845a8 | ||
|   | 40eb461541 | ||
|   | 3c03bd5d6c | ||
|   | ddd529f9bf | ||
|   | 4c4d01ed09 | ||
|   | 601541ebbf | ||
|   | 5f6bda8838 | ||
|   | c226ff8419 | ||
|   | 8cd3cc5836 | ||
|   | 27203d4d7f | ||
|   | ecadd189a2 | ||
|   | be4ce07b7c | ||
|   | a30b46dff9 | ||
|   | 295a3b9484 | ||
|   | c9ee8f301e | ||
|   | a8a97d608e | ||
|   | 77a457ae01 | ||
|   | 88955d4e15 | ||
|   | b68de30418 | ||
|   | facbed59bc | ||
|   | 71781426e0 | ||
|   | f48e749721 | ||
|   | 56f87f39d6 | ||
|   | 334642c091 | ||
|   | 4cd5e619a5 | ||
|   | b3a0365447 | ||
|   | dedc295441 | ||
|   | 07d6c1cc4b | ||
|   | 38becdd251 | ||
|   | 2108691f68 | ||
|   | 3c2786ed6d | ||
|   | 3378899c5c | ||
|   | 1efd66d010 | ||
|   | 4895d48e11 | ||
|   | df7ce2f752 | ||
|   | 0262a9ec90 | ||
|   | c6c8e80516 | ||
|   | f20a7a2b14 | ||
|   | 327c73f22a | ||
|   | b3e7ed5941 | ||
|   | 9381dd0a85 | ||
|   | e2f027dd61 | ||
|   | b6f7118a43 | ||
|   | f7b941f8a0 | ||
|   | 9996bfbbc3 | ||
|   | 574301df07 | ||
|   | 6834f660d7 | ||
|   | e8e37cd8ea | ||
|   | a47bbe949b | ||
|   | 7c72a36e8b | ||
|   | 8d4989d2db | ||
|   | 2de59c22cf | ||
|   | d23ce9b6a9 | ||
|   | 02f3904d6a | ||
|   | 883b7bee30 | ||
|   | ff7aa917f7 | ||
|   | e00a54c24e | ||
|   | 183296ff63 | ||
|   | 9d23b111b6 | ||
|   | 8b26a84162 | ||
|   | 9d3150ccd3 | ||
|   | 6460fefbd8 | ||
|   | 7a9aa28210 | ||
|   | 1c085d8794 | ||
|   | 1055b228a1 | ||
|   | 05ad9ca2cc | ||
|   | 0f5d27a60d | ||
|   | 1390d4d235 | ||
|   | bf37713371 | ||
|   | 88b20d878d | ||
|   | 8d29cd0c5c | ||
|   | dafaadd80a | ||
|   | 4f036468b0 | ||
|   | 8df966fcee | ||
|   | 6d8ac266a3 | ||
|   | 6e9ffed843 | ||
|   | 20777ed3ce | ||
|   | fa68d2bef4 | ||
|   | 2726ec8d82 | ||
|   | a9df73e63a | ||
|   | b8ca62efda | ||
|   | afd1b65dc5 | ||
|   | b7f298035d | ||
|   | 90733b5daa | ||
|   | 35aef3819f | ||
|   | bbe5593b52 | ||
|   | 7911ff02cc | ||
|   | f1ecb595b4 | ||
|   | 010052de3a | ||
|   | 56856caa8a | ||
|   | 3d3c9d6a66 | ||
|   | 159d1819b0 | ||
|   | 5597e14985 | ||
|   | 7b570f861e | ||
|   | c6c2079226 | ||
|   | b9d5f24f37 | ||
|   | 738d3a0050 | ||
|   | 64f6afc730 | ||
|   | 04bc8f2e12 | ||
|   | 67f4634ae0 | ||
|   | 271b1ed563 | ||
|   | b7c6d33c9e | ||
|   | a138413c5f | ||
|   | ca1c672f0d | ||
|   | b41ddcdc2c | ||
|   | 48f543b9f6 | ||
|   | e41eb4a087 | ||
|   | 73535da7fa | ||
|   | 84ddd0d0da | ||
|   | 7600f79776 | ||
|   | 2164b644e6 | ||
|   | 29e1550446 | ||
|   | f2d8165016 | ||
|   | e8c17a04ee | ||
|   | cfd9bc6f43 | ||
|   | 3ee8497cac | ||
|   | 58a7019b24 | ||
|   | 212f70cbb5 | ||
|   | 18e2c4e411 | 
							
								
								
									
										27
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <!--  Thanks for sending a pull request! Here are some tips for you: | ||||
| 1. Please read our contributor guidelines: https://docs.onepanel.ai/docs/getting-started/contributing | ||||
| 2. Prefix the title of this PR with `feat:`, `fix:`, `docs:` or `chore:`, example: `feat: added great feature` | ||||
| 3. If this PR is a feature or enhancement, then create an issue (https://github.com/onepanelio/core/issues) first.  | ||||
| --> | ||||
|  | ||||
| **What this PR does**: | ||||
|  | ||||
| **Which issue(s) this PR fixes**: | ||||
| <!-- | ||||
| *Automatically closes linked issue when PR is merged. | ||||
| Usage: `Fixes onepanelio/core#<issue-number>` | ||||
| --> | ||||
| Fixes onepanelio/core# | ||||
|  | ||||
| **Special notes for your reviewer**: | ||||
|  | ||||
| **Checklist** | ||||
|  | ||||
| Please check if applies | ||||
|  | ||||
| - [ ] I have added/updated relevant unit tests | ||||
| - [ ] I have added/updated relevant documentation | ||||
|  | ||||
| Required  | ||||
|  | ||||
| - [ ] I accept to release these changes under the Apache 2.0 License    | ||||
							
								
								
									
										4
									
								
								.github/issue_label_bot.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.github/issue_label_bot.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| label-alias: | ||||
|   bug: 'kind/bug' | ||||
|   feature_request: 'kind/enhancement' | ||||
|   question: 'kind/question' | ||||
							
								
								
									
										1
									
								
								.github/semantic.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.github/semantic.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| titleOnly: true | ||||
							
								
								
									
										38
									
								
								.github/workflows/push_dev_branch.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.github/workflows/push_dev_branch.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| name: Publish dev docker image | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
| jobs: | ||||
|   test-code-job: | ||||
|     runs-on: ubuntu-latest | ||||
|     services: | ||||
|       postgres: | ||||
|         image: postgres:12.3 | ||||
|         env: | ||||
|           POSTGRES_DB: onepanel | ||||
|           POSTGRES_USER: admin | ||||
|           POSTGRES_PASSWORD: tester | ||||
|         options: >- | ||||
|           --health-cmd pg_isready | ||||
|           --health-interval 10s | ||||
|           --health-timeout 5s | ||||
|           --health-retries 5 | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - name: Run testing code | ||||
|         uses: cedrickring/golang-action@1.5.2 | ||||
|         with: | ||||
|           args: go test github.com/onepanelio/core/pkg -db=postgres | ||||
|   build: | ||||
|     needs: test-code-job | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@master | ||||
|     - name: Publish to Registry | ||||
|       uses: elgohr/Publish-Docker-Github-Action@master | ||||
|       with: | ||||
|         name: onepanel/core | ||||
|         tags: "dev" | ||||
|         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
							
								
								
									
										17
									
								
								.github/workflows/push_develop_branch.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/push_develop_branch.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,17 +0,0 @@ | ||||
| name: Publish develop docker image | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - develop | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@master | ||||
|     - 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 }} | ||||
|         snapshot: true | ||||
| @@ -1,32 +1,24 @@ | ||||
| name: Bump version and create tag | ||||
| name: Publish docker image on tag push | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|     tags: | ||||
|       - '*' | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - name: Bump version and push tag | ||||
|         id: version_bump | ||||
|         uses: anothrNick/github-tag-action@1.17.2 | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|           WITH_V: true | ||||
|           DEFAULT_BUMP: 'minor' | ||||
|       - name: Alias New tag to VERSION | ||||
|         run: echo "::set-env name=VERSION::${{ steps.version_bump.outputs.new_tag }}" | ||||
|       - 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 }} | ||||
|           buildargs: VERSION | ||||
|           tags: ${{ steps.version_bump.outputs.new_tag }}, latest | ||||
|           tags: "${{ env.GIT_TAG_NAME }}" | ||||
|       - name: Set Slack Message | ||||
|         run: echo "::set-env name=SLACK_MESSAGE::Version $VERSION. Docker Tag onepanel/core:$VERSION" | ||||
|         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: | ||||
| @@ -35,5 +27,3 @@ jobs: | ||||
|           SLACK_TITLE: New Core Version | ||||
|           SLACK_USERNAME: opBot | ||||
|           SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} | ||||
| 
 | ||||
| 
 | ||||
| @@ -49,7 +49,7 @@ Make sure that your `$GOBIN` is in your `$PATH`. | ||||
|  | ||||
| Generate Go and Swagger APIs: | ||||
| ```bash | ||||
| make api | ||||
| make api version=1.0.0 | ||||
| ``` | ||||
|  | ||||
| ## Minikube Debugging and Development | ||||
| @@ -122,6 +122,8 @@ After this, build main.go and run the executable. | ||||
|  | ||||
| ## Code Structure & Organization | ||||
|  | ||||
| ### `utils` dir | ||||
|  | ||||
| ```shell script | ||||
| utils/*.go | ||||
| ``` | ||||
| @@ -150,4 +152,25 @@ These can be pulled out into their own package or into a new v2 directory if nee | ||||
| You can add | ||||
| - kubernetes specific operations | ||||
| - database specific operations | ||||
| - types | ||||
| - types | ||||
|  | ||||
| ### `cmd` dir | ||||
| Each source file here is assumed to result in an executable. | ||||
| - Hence the `package main` at the top of each | ||||
|  | ||||
| Place each source file into it's own folder. | ||||
| Example source file name: `flush_cache.go` | ||||
| - Dir structure: `cmd/flush-cache/flush_cache.go` | ||||
|  | ||||
| To avoid errors like this during docker build | ||||
| ```text | ||||
| # github.com/onepanelio/core/cmd | ||||
| cmd/goose.go:22:6: main redeclared in this block | ||||
|         previous declaration at cmd/gen-release-md.go:136:6 | ||||
| github.com/onepanelio/core | ||||
| ``` | ||||
| Caused by | ||||
| ```dockerfile | ||||
| RUN go install -v ./... | ||||
| ``` | ||||
|  | ||||
|   | ||||
| @@ -5,11 +5,13 @@ COPY . . | ||||
|  | ||||
| RUN go get -d -v ./... | ||||
| RUN go install -v ./... | ||||
|  | ||||
| RUN go get -u github.com/pressly/goose/cmd/goose | ||||
| RUN go build -o /go/bin/goose ./cmd/goose/goose.go | ||||
|  | ||||
| FROM golang:1.13.10 | ||||
| COPY --from=builder /go/bin/core . | ||||
| COPY --from=builder /go/src/db ./db | ||||
| COPY --from=builder /go/bin/goose . | ||||
|  | ||||
| EXPOSE 8888 | ||||
| EXPOSE 8887 | ||||
|   | ||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -1,3 +1,5 @@ | ||||
|                 Copyright 2020 Onepanel, Inc.  All rights reserved. | ||||
|                  | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|   | ||||
							
								
								
									
										15
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,9 +1,17 @@ | ||||
| COMMIT_HASH=$(shell git rev-parse --short HEAD) | ||||
|  | ||||
| .PHONY: init | ||||
|  | ||||
| init: | ||||
| ifndef version | ||||
| 	$(error version is undefined) | ||||
| endif | ||||
|  | ||||
| jq: | ||||
| 	cat api/apidocs.swagger.json \ | ||||
| 		| jq 'walk( if type == "object" then with_entries( .key |= sub( "api\\."; "") ) else . end )' \ | ||||
| 		| jq 'walk( if type == "string" then gsub( "api\\."; "") else . end )' \ | ||||
| 		| jq '.info.version = "$(version)"' \ | ||||
| 		> api/api.swagger.json | ||||
| 	rm api/apidocs.swagger.json | ||||
|  | ||||
| @@ -16,7 +24,7 @@ protoc: | ||||
|  		--grpc-gateway_out=logtostderr=true,allow_delete_body=true:api \ | ||||
|  		--swagger_out=allow_merge=true,fqn_for_swagger_name=true,allow_delete_body=true,logtostderr=true,simple_operation_ids=true:api | ||||
|  | ||||
| api: protoc jq | ||||
| api: init protoc jq | ||||
|  | ||||
| docker-build: | ||||
| 	docker build -t onepanel-core . | ||||
| @@ -26,3 +34,8 @@ docker-push: | ||||
| 	docker push onepanel/core:$(COMMIT_HASH) | ||||
|  | ||||
| docker: docker-build docker-push | ||||
|  | ||||
| run-tests: | ||||
| 	docker run --rm --name test-onepanel-postgres -p 5432:5432 -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=tester -e POSTGRES_DB=onepanel -d  postgres:12.3 | ||||
| 	go test github.com/onepanelio/core/pkg -count=1 ||: | ||||
| 	docker stop test-onepanel-postgres | ||||
							
								
								
									
										107
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,10 +1,107 @@ | ||||
| # Onepanel | ||||
| <img width="240px" src="img/logo.png"> | ||||
|  | ||||
| Welcome to Onepanel! This is the main repository for the API and also where you can submit bugs and enhancement requests. | ||||
|  | ||||
|  | ||||
| [](https://github.com/onepanelio/core/releases) | ||||
| [](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://opensource.org/licenses/Apache-2.0) | ||||
|  | ||||
| ## Getting started | ||||
| See our [deployment guide](https://onepanelio.github.io/core-docs/docs/deployment/overview) to get started. | ||||
| Production scale, Kubernetes-native vision AI platform, with fully integrated components for model building, automated labeling, data processing and model training pipelines. | ||||
|  | ||||
| ## 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 | ||||
| -  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> | ||||
|  | ||||
| -  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. | ||||
|  | ||||
| ## Quick start | ||||
| See [quick start guide](https://docs.onepanel.ai/docs/getting-started/quickstart) to get started with the platform of your choice. | ||||
|  | ||||
| ### Quick start videos | ||||
| [Getting started with Microsoft Azure](https://youtu.be/CQBIYfBk3Zk)\ | ||||
| [Getting started with Amazon EKS](https://youtu.be/Ipdd8f6D6IM)\ | ||||
| [Getting started with Google GKE](https://youtu.be/pZRO63SnQ8A) | ||||
|  | ||||
| ## Community | ||||
| See [documentation](https://docs.onepanel.ai) to get started or for more detailed operational and user guides. | ||||
|  | ||||
| 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). | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| See our [contribution guide](https://onepanelio.github.io/core-docs/docs/getting-started/contributing) to get started. | ||||
| 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\ | ||||
| [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 | ||||
|  | ||||
| See `CONTRIBUTING.md` in each repository for development guidelines. Also, see [contribution guide](https://docs.onepanel.ai/docs/getting-started/contributing) for additional guidelines. | ||||
|  | ||||
|  | ||||
| ## Acknowledgments | ||||
| Onepanel seamlessly integrates the following excellent open source projects. We are grateful for the support these communities provide and do our best to contribute back as much as possible. | ||||
|  | ||||
| [Argo](https://github.com/argoproj/argo)\ | ||||
| [CVAT](https://github.com/opencv/cvat)\ | ||||
| [JupyterLab](https://github.com/jupyterlab/jupyterlab) | ||||
|  | ||||
|  | ||||
| ## License | ||||
| Onepanel is licensed under [Apache 2.0](https://github.com/onepanelio/core/blob/master/LICENSE). | ||||
|  | ||||
| ## Need a managed solution? | ||||
| Visit our [website](https://www.onepanel.io/) for more information about our managed offerings. | ||||
|   | ||||
| @@ -31,25 +31,25 @@ var file_api_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, | ||||
| 	0x1a, 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, 0x42, 0x8b, | ||||
| 	0x02, 0x92, 0x41, 0x87, 0x02, 0x12, 0x74, 0x0a, 0x0d, 0x4f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, | ||||
| 	0x6c, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x12, 0x19, 0x4f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, | ||||
| 	0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x41, 0x50, | ||||
| 	0x49, 0x22, 0x3b, 0x0a, 0x15, 0x4f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x43, 0x6f, | ||||
| 	0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x22, 0x68, 0x74, 0x74, 0x70, | ||||
| 	0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, | ||||
| 	0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x32, 0x0b, | ||||
| 	0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x62, 0x65, 0x74, 0x61, 0x31, 0x1a, 0x0e, 0x6c, 0x6f, 0x63, | ||||
| 	0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x38, 0x38, 0x38, 0x2a, 0x02, 0x01, 0x02, 0x32, | ||||
| 	0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, | ||||
| 	0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, | ||||
| 	0x73, 0x6f, 0x6e, 0x5a, 0x49, 0x0a, 0x47, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, | ||||
| 	0x3d, 0x08, 0x02, 0x12, 0x28, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, | ||||
| 	0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, | ||||
| 	0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x1a, 0x0d, 0x61, | ||||
| 	0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, | ||||
| 	0x0a, 0x0a, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x89, | ||||
| 	0x02, 0x92, 0x41, 0x85, 0x02, 0x12, 0x58, 0x0a, 0x08, 0x4f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, | ||||
| 	0x6c, 0x12, 0x0c, 0x4f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x41, 0x50, 0x49, 0x22, | ||||
| 	0x36, 0x0a, 0x10, 0x4f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x6a, | ||||
| 	0x65, 0x63, 0x74, 0x12, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, | ||||
| 	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x6e, 0x65, 0x70, 0x61, 0x6e, 0x65, 0x6c, | ||||
| 	0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x32, 0x06, 0x30, 0x2e, 0x31, 0x30, 0x2e, 0x30, 0x1a, | ||||
| 	0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x38, 0x38, 0x38, 0x2a, | ||||
| 	0x02, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 	0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, | ||||
| 	0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x18, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, | ||||
| 	0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, | ||||
| 	0x6d, 0x5a, 0x49, 0x0a, 0x47, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x3d, 0x08, | ||||
| 	0x02, 0x12, 0x28, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, | ||||
| 	0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, | ||||
| 	0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x1a, 0x0d, 0x61, 0x75, 0x74, | ||||
| 	0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, | ||||
| 	0x0a, 0x06, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, | ||||
| 	0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var file_api_proto_goTypes = []interface{}{} | ||||
|   | ||||
| @@ -6,11 +6,11 @@ import "protoc-gen-swagger/options/annotations.proto"; | ||||
|  | ||||
| option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { | ||||
|     info: { | ||||
|         title: "Onepanel Core"; | ||||
|         description: "Onepanel Core project API"; | ||||
|         version: "1.0.0-beta1"; | ||||
|         title: "Onepanel"; | ||||
|         description: "Onepanel API"; | ||||
|         version: "0.10.0"; | ||||
| 		contact: { | ||||
| 			name: "Onepanel Core project"; | ||||
| 			name: "Onepanel project"; | ||||
| 			url: "https://github.com/onepanelio/core"; | ||||
| 		}; | ||||
|     }; | ||||
| @@ -19,6 +19,7 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { | ||||
| 	schemes: HTTPS; | ||||
| 	consumes: "application/json"; | ||||
| 	produces: "application/json"; | ||||
| 	produces: "application/octet-stream"; | ||||
| 	security_definitions: { | ||||
| 		security: { | ||||
| 			key: "Bearer"; | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| { | ||||
|   "swagger": "2.0", | ||||
|   "info": { | ||||
|     "title": "Onepanel Core", | ||||
|     "description": "Onepanel Core project API", | ||||
|     "version": "1.0.0-beta1", | ||||
|     "title": "Onepanel", | ||||
|     "description": "Onepanel API", | ||||
|     "version": "0.13.0", | ||||
|     "contact": { | ||||
|       "name": "Onepanel Core project", | ||||
|       "name": "Onepanel project", | ||||
|       "url": "https://github.com/onepanelio/core" | ||||
|     } | ||||
|   }, | ||||
| @@ -18,7 +18,8 @@ | ||||
|     "application/json" | ||||
|   ], | ||||
|   "produces": [ | ||||
|     "application/json" | ||||
|     "application/json", | ||||
|     "application/octet-stream" | ||||
|   ], | ||||
|   "paths": { | ||||
|     "/apis/v1beta1/auth": { | ||||
| @@ -38,6 +39,16 @@ | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "body", | ||||
|             "in": "body", | ||||
|             "required": true, | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/IsAuthorized" | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "AuthService" | ||||
|         ] | ||||
| @@ -75,6 +86,28 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/config": { | ||||
|       "get": { | ||||
|         "operationId": "GetConfig", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/GetConfigResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "tags": [ | ||||
|           "ConfigService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/namespaces": { | ||||
|       "get": { | ||||
|         "operationId": "ListNamespaces", | ||||
| @@ -701,6 +734,86 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/service": { | ||||
|       "get": { | ||||
|         "operationId": "ListServices", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/ListServicesResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "pageSize", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "integer", | ||||
|             "format": "int32" | ||||
|           }, | ||||
|           { | ||||
|             "name": "page", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "integer", | ||||
|             "format": "int32" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "ServiceService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/service/{name}": { | ||||
|       "get": { | ||||
|         "operationId": "GetService", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/Service" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "name", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "ServiceService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workflow_executions": { | ||||
|       "get": { | ||||
|         "operationId": "ListWorkflowExecutions", | ||||
| @@ -750,6 +863,31 @@ | ||||
|             "required": false, | ||||
|             "type": "integer", | ||||
|             "format": "int32" | ||||
|           }, | ||||
|           { | ||||
|             "name": "order", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "labels", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "phase", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "includeSystem", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "boolean", | ||||
|             "format": "boolean" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
| @@ -793,6 +931,36 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workflow_executions/statistics": { | ||||
|       "get": { | ||||
|         "operationId": "GetWorkflowExecutionStatisticsForNamespace", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/GetWorkflowExecutionStatisticsForNamespaceResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
|             "description": "An unexpected error response", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/grpc.gateway.runtime.Error" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "namespace", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "WorkflowService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workflow_executions/{uid}": { | ||||
|       "get": { | ||||
|         "operationId": "GetWorkflowExecution", | ||||
| @@ -1332,6 +1500,12 @@ | ||||
|             "required": false, | ||||
|             "type": "integer", | ||||
|             "format": "int32" | ||||
|           }, | ||||
|           { | ||||
|             "name": "labels", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
| @@ -1675,14 +1849,14 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workflow_templates/{workflowTemplate.uid}/versions/{workflowTemplate.version}": { | ||||
|       "put": { | ||||
|         "operationId": "UpdateWorkflowTemplateVersion", | ||||
|     "/apis/v1beta1/{namespace}/workspace/statistics": { | ||||
|       "get": { | ||||
|         "operationId": "GetWorkspaceStatisticsForNamespace", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/WorkflowTemplate" | ||||
|               "$ref": "#/definitions/GetWorkspaceStatisticsForNamespaceResponse" | ||||
|             } | ||||
|           }, | ||||
|           "default": { | ||||
| @@ -1698,31 +1872,10 @@ | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "workflowTemplate.uid", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "workflowTemplate.version", | ||||
|             "in": "path", | ||||
|             "required": true, | ||||
|             "type": "string", | ||||
|             "format": "int64" | ||||
|           }, | ||||
|           { | ||||
|             "name": "body", | ||||
|             "in": "body", | ||||
|             "required": true, | ||||
|             "schema": { | ||||
|               "$ref": "#/definitions/WorkflowTemplate" | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "WorkflowTemplateService" | ||||
|           "WorkspaceService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
| @@ -1763,6 +1916,24 @@ | ||||
|             "required": false, | ||||
|             "type": "integer", | ||||
|             "format": "int32" | ||||
|           }, | ||||
|           { | ||||
|             "name": "order", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "labels", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "uid", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
| @@ -2044,6 +2215,24 @@ | ||||
|             "required": false, | ||||
|             "type": "integer", | ||||
|             "format": "int32" | ||||
|           }, | ||||
|           { | ||||
|             "name": "order", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "labels", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           }, | ||||
|           { | ||||
|             "name": "phase", | ||||
|             "in": "query", | ||||
|             "required": false, | ||||
|             "type": "string" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
| @@ -2271,6 +2460,42 @@ | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workspaces/{uid}/retry": { | ||||
|       "put": { | ||||
|         "operationId": "RetryLastWorkspaceAction", | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "description": "A successful response.", | ||||
|             "schema": { | ||||
|               "properties": {} | ||||
|             } | ||||
|           }, | ||||
|           "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" | ||||
|           } | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "WorkspaceService" | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     "/apis/v1beta1/{namespace}/workspaces/{uid}/status": { | ||||
|       "put": { | ||||
|         "operationId": "UpdateWorkspaceStatus", | ||||
| @@ -2658,6 +2883,23 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetConfigResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "apiUrl": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "domain": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "fqdn": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "nodePool": { | ||||
|           "$ref": "#/definitions/NodePool" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetLabelsResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -2680,6 +2922,42 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetWorkflowExecutionStatisticsForNamespaceResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "stats": { | ||||
|           "$ref": "#/definitions/WorkflowExecutionStatisticReport" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "GetWorkspaceStatisticsForNamespaceResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "stats": { | ||||
|           "$ref": "#/definitions/WorkspaceStatisticReport" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "IsAuthorized": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "namespace": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "verb": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "group": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "resource": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "resourceName": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "IsAuthorizedResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -2802,6 +3080,33 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "ListServicesResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "count": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "services": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/Service" | ||||
|           } | ||||
|         }, | ||||
|         "page": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "pages": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "totalCount": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "ListWorkflowExecutionsResponse": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -2974,6 +3279,31 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "NodePool": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "label": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "options": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/NodePoolOption" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "NodePoolOption": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "name": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "value": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "Parameter": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -2996,6 +3326,9 @@ | ||||
|           "type": "boolean", | ||||
|           "format": "boolean" | ||||
|         }, | ||||
|         "visibility": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "options": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
| @@ -3038,6 +3371,17 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "Service": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "name": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "url": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "Statistics": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -3122,6 +3466,17 @@ | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/KeyValue" | ||||
|           } | ||||
|         }, | ||||
|         "metadata": { | ||||
|           "$ref": "#/definitions/WorkflowExecutionMetadata" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "WorkflowExecutionMetadata": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "url": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -3167,6 +3522,9 @@ | ||||
|         "createdAt": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "modifiedAt": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "uid": { | ||||
|           "type": "string" | ||||
|         }, | ||||
| @@ -3203,6 +3561,12 @@ | ||||
|         }, | ||||
|         "cronStats": { | ||||
|           "$ref": "#/definitions/CronWorkflowStatisticsReport" | ||||
|         }, | ||||
|         "parameters": { | ||||
|           "type": "array", | ||||
|           "items": { | ||||
|             "$ref": "#/definitions/Parameter" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -3251,6 +3615,70 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "WorkspaceStatisticReport": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "total": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "lastCreated": { | ||||
|           "type": "string" | ||||
|         }, | ||||
|         "launching": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "running": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "updating": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "pausing": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "paused": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "terminating": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "terminated": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "failedToPause": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "failedToResume": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "failedToTerminate": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "failedToLaunch": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "failedToUpdate": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         }, | ||||
|         "failed": { | ||||
|           "type": "integer", | ||||
|           "format": "int32" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "WorkspaceStatus": { | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
| @@ -3303,6 +3731,9 @@ | ||||
|         "isArchived": { | ||||
|           "type": "boolean", | ||||
|           "format": "boolean" | ||||
|         }, | ||||
|         "description": { | ||||
|           "type": "string" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   | ||||
							
								
								
									
										398
									
								
								api/auth.pb.go
									
									
									
									
									
								
							
							
						
						
									
										398
									
								
								api/auth.pb.go
									
									
									
									
									
								
							| @@ -9,7 +9,7 @@ package api | ||||
| import ( | ||||
| 	context "context" | ||||
| 	proto "github.com/golang/protobuf/proto" | ||||
| 	empty "github.com/golang/protobuf/ptypes/empty" | ||||
| 	_ "github.com/golang/protobuf/ptypes/empty" | ||||
| 	_ "google.golang.org/genproto/googleapis/api/annotations" | ||||
| 	grpc "google.golang.org/grpc" | ||||
| 	codes "google.golang.org/grpc/codes" | ||||
| @@ -31,7 +31,7 @@ const ( | ||||
| // of the legacy proto package is being used. | ||||
| const _ = proto.ProtoPackageIsVersion4 | ||||
|  | ||||
| type IsAuthorizedRequest struct { | ||||
| type IsAuthorized struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
| @@ -43,10 +43,85 @@ type IsAuthorizedRequest struct { | ||||
| 	ResourceName string `protobuf:"bytes,5,opt,name=resourceName,proto3" json:"resourceName,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) Reset() { | ||||
| 	*x = IsAuthorized{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[0] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*IsAuthorized) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsAuthorized) 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 IsAuthorized.ProtoReflect.Descriptor instead. | ||||
| func (*IsAuthorized) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{0} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) GetVerb() string { | ||||
| 	if x != nil { | ||||
| 		return x.Verb | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) GetGroup() string { | ||||
| 	if x != nil { | ||||
| 		return x.Group | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) GetResource() string { | ||||
| 	if x != nil { | ||||
| 		return x.Resource | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorized) GetResourceName() string { | ||||
| 	if x != nil { | ||||
| 		return x.ResourceName | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type IsAuthorizedRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	IsAuthorized *IsAuthorized `protobuf:"bytes,1,opt,name=isAuthorized,proto3" json:"isAuthorized,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) Reset() { | ||||
| 	*x = IsAuthorizedRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[0] | ||||
| 		mi := &file_auth_proto_msgTypes[1] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -59,7 +134,7 @@ func (x *IsAuthorizedRequest) String() string { | ||||
| func (*IsAuthorizedRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsAuthorizedRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[0] | ||||
| 	mi := &file_auth_proto_msgTypes[1] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -72,42 +147,14 @@ func (x *IsAuthorizedRequest) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsAuthorizedRequest.ProtoReflect.Descriptor instead. | ||||
| func (*IsAuthorizedRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{0} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{1} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) GetNamespace() string { | ||||
| func (x *IsAuthorizedRequest) GetIsAuthorized() *IsAuthorized { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 		return x.IsAuthorized | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) GetVerb() string { | ||||
| 	if x != nil { | ||||
| 		return x.Verb | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) GetGroup() string { | ||||
| 	if x != nil { | ||||
| 		return x.Group | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) GetResource() string { | ||||
| 	if x != nil { | ||||
| 		return x.Resource | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedRequest) GetResourceName() string { | ||||
| 	if x != nil { | ||||
| 		return x.ResourceName | ||||
| 	} | ||||
| 	return "" | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type IsAuthorizedResponse struct { | ||||
| @@ -121,7 +168,7 @@ type IsAuthorizedResponse struct { | ||||
| func (x *IsAuthorizedResponse) Reset() { | ||||
| 	*x = IsAuthorizedResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[1] | ||||
| 		mi := &file_auth_proto_msgTypes[2] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -134,7 +181,7 @@ func (x *IsAuthorizedResponse) String() string { | ||||
| func (*IsAuthorizedResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsAuthorizedResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[1] | ||||
| 	mi := &file_auth_proto_msgTypes[2] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -147,7 +194,7 @@ func (x *IsAuthorizedResponse) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsAuthorizedResponse.ProtoReflect.Descriptor instead. | ||||
| func (*IsAuthorizedResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{1} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{2} | ||||
| } | ||||
|  | ||||
| func (x *IsAuthorizedResponse) GetAuthorized() bool { | ||||
| @@ -168,7 +215,7 @@ type TokenWrapper struct { | ||||
| func (x *TokenWrapper) Reset() { | ||||
| 	*x = TokenWrapper{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[2] | ||||
| 		mi := &file_auth_proto_msgTypes[3] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -181,7 +228,7 @@ func (x *TokenWrapper) String() string { | ||||
| func (*TokenWrapper) ProtoMessage() {} | ||||
|  | ||||
| func (x *TokenWrapper) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[2] | ||||
| 	mi := &file_auth_proto_msgTypes[3] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -194,7 +241,7 @@ func (x *TokenWrapper) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use TokenWrapper.ProtoReflect.Descriptor instead. | ||||
| func (*TokenWrapper) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{2} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{3} | ||||
| } | ||||
|  | ||||
| func (x *TokenWrapper) GetToken() string { | ||||
| @@ -215,7 +262,7 @@ type IsValidTokenRequest struct { | ||||
| func (x *IsValidTokenRequest) Reset() { | ||||
| 	*x = IsValidTokenRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[3] | ||||
| 		mi := &file_auth_proto_msgTypes[4] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -228,7 +275,7 @@ func (x *IsValidTokenRequest) String() string { | ||||
| func (*IsValidTokenRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsValidTokenRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[3] | ||||
| 	mi := &file_auth_proto_msgTypes[4] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -241,7 +288,7 @@ func (x *IsValidTokenRequest) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsValidTokenRequest.ProtoReflect.Descriptor instead. | ||||
| func (*IsValidTokenRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{3} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{4} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenRequest) GetToken() *TokenWrapper { | ||||
| @@ -262,7 +309,7 @@ type IsValidTokenResponse struct { | ||||
| func (x *IsValidTokenResponse) Reset() { | ||||
| 	*x = IsValidTokenResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[4] | ||||
| 		mi := &file_auth_proto_msgTypes[5] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -275,7 +322,7 @@ func (x *IsValidTokenResponse) String() string { | ||||
| func (*IsValidTokenResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsValidTokenResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_proto_msgTypes[4] | ||||
| 	mi := &file_auth_proto_msgTypes[5] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -288,7 +335,7 @@ func (x *IsValidTokenResponse) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use IsValidTokenResponse.ProtoReflect.Descriptor instead. | ||||
| func (*IsValidTokenResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{4} | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{5} | ||||
| } | ||||
|  | ||||
| func (x *IsValidTokenResponse) GetDomain() string { | ||||
| @@ -298,77 +345,6 @@ func (x *IsValidTokenResponse) GetDomain() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type IsWorkspaceAuthenticatedRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	FQDN               string `protobuf:"bytes,1,opt,name=FQDN,proto3" json:"FQDN,omitempty"` | ||||
| 	XOriginalMethod    string `protobuf:"bytes,2,opt,name=XOriginalMethod,proto3" json:"XOriginalMethod,omitempty"` | ||||
| 	XOriginalAuthority string `protobuf:"bytes,3,opt,name=XOriginalAuthority,proto3" json:"XOriginalAuthority,omitempty"` | ||||
| 	XOriginalUri       string `protobuf:"bytes,4,opt,name=XOriginalUri,proto3" json:"XOriginalUri,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) Reset() { | ||||
| 	*x = IsWorkspaceAuthenticatedRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_auth_proto_msgTypes[5] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*IsWorkspaceAuthenticatedRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_auth_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 IsWorkspaceAuthenticatedRequest.ProtoReflect.Descriptor instead. | ||||
| func (*IsWorkspaceAuthenticatedRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_auth_proto_rawDescGZIP(), []int{5} | ||||
| } | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) GetFQDN() string { | ||||
| 	if x != nil { | ||||
| 		return x.FQDN | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) GetXOriginalMethod() string { | ||||
| 	if x != nil { | ||||
| 		return x.XOriginalMethod | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) GetXOriginalAuthority() string { | ||||
| 	if x != nil { | ||||
| 		return x.XOriginalAuthority | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *IsWorkspaceAuthenticatedRequest) GetXOriginalUri() string { | ||||
| 	if x != nil { | ||||
| 		return x.XOriginalUri | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| var File_auth_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_auth_proto_rawDesc = []byte{ | ||||
| @@ -376,64 +352,50 @@ var file_auth_proto_rawDesc = []byte{ | ||||
| 	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, 0x9d, 0x01, 0x0a, | ||||
| 	0x13, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 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, 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, 0x36, 0x0a, 0x14, | ||||
| 	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, | ||||
| 	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, | ||||
| 	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, 0x22, 0xb3, 0x01, 0x0a, 0x1f, 0x49, | ||||
| 	0x73, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, | ||||
| 	0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, | ||||
| 	0x0a, 0x04, 0x46, 0x51, 0x44, 0x4e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x51, | ||||
| 	0x44, 0x4e, 0x12, 0x28, 0x0a, 0x0f, 0x58, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4d, | ||||
| 	0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x58, 0x4f, 0x72, | ||||
| 	0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2e, 0x0a, 0x12, | ||||
| 	0x58, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, | ||||
| 	0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x58, 0x4f, 0x72, 0x69, 0x67, 0x69, | ||||
| 	0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0c, | ||||
| 	0x58, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x55, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, | ||||
| 	0x28, 0x09, 0x52, 0x0c, 0x58, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x55, 0x72, 0x69, | ||||
| 	0x32, 0xe1, 0x02, 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, 0x82, | ||||
| 	0x01, 0x0a, 0x18, 0x49, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x75, | ||||
| 	0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x24, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x49, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x75, 0x74, | ||||
| 	0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x22, 0x42, 0x20, 0x0a, 0x04, 0x48, 0x45, 0x41, 0x44, 0x12, 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, 0x12, 0x5f, 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, 0x49, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, | ||||
| 	0x22, 0x12, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, | ||||
| 	0x61, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x12, 0x2f, 0x61, | ||||
| 	0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, | ||||
| 	0x3a, 0x0c, 0x69, 0x73, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x62, 0x06, | ||||
| 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
| @@ -450,27 +412,25 @@ func file_auth_proto_rawDescGZIP() []byte { | ||||
|  | ||||
| var file_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 6) | ||||
| var file_auth_proto_goTypes = []interface{}{ | ||||
| 	(*IsAuthorizedRequest)(nil),             // 0: api.IsAuthorizedRequest | ||||
| 	(*IsAuthorizedResponse)(nil),            // 1: api.IsAuthorizedResponse | ||||
| 	(*TokenWrapper)(nil),                    // 2: api.TokenWrapper | ||||
| 	(*IsValidTokenRequest)(nil),             // 3: api.IsValidTokenRequest | ||||
| 	(*IsValidTokenResponse)(nil),            // 4: api.IsValidTokenResponse | ||||
| 	(*IsWorkspaceAuthenticatedRequest)(nil), // 5: api.IsWorkspaceAuthenticatedRequest | ||||
| 	(*empty.Empty)(nil),                     // 6: google.protobuf.Empty | ||||
| 	(*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 | ||||
| } | ||||
| var file_auth_proto_depIdxs = []int32{ | ||||
| 	2, // 0: api.IsValidTokenRequest.token:type_name -> api.TokenWrapper | ||||
| 	3, // 1: api.AuthService.IsValidToken:input_type -> api.IsValidTokenRequest | ||||
| 	5, // 2: api.AuthService.IsWorkspaceAuthenticated:input_type -> api.IsWorkspaceAuthenticatedRequest | ||||
| 	0, // 3: api.AuthService.IsAuthorized:input_type -> api.IsAuthorizedRequest | ||||
| 	4, // 4: api.AuthService.IsValidToken:output_type -> api.IsValidTokenResponse | ||||
| 	6, // 5: api.AuthService.IsWorkspaceAuthenticated:output_type -> google.protobuf.Empty | ||||
| 	1, // 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 | ||||
| 	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 | ||||
| } | ||||
|  | ||||
| func init() { file_auth_proto_init() } | ||||
| @@ -480,7 +440,7 @@ func file_auth_proto_init() { | ||||
| 	} | ||||
| 	if !protoimpl.UnsafeEnabled { | ||||
| 		file_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorizedRequest); i { | ||||
| 			switch v := v.(*IsAuthorized); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -492,7 +452,7 @@ func file_auth_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsAuthorizedResponse); i { | ||||
| 			switch v := v.(*IsAuthorizedRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -504,7 +464,7 @@ func file_auth_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*TokenWrapper); i { | ||||
| 			switch v := v.(*IsAuthorizedResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -516,7 +476,7 @@ func file_auth_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsValidTokenRequest); i { | ||||
| 			switch v := v.(*TokenWrapper); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -528,7 +488,7 @@ func file_auth_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsValidTokenResponse); i { | ||||
| 			switch v := v.(*IsValidTokenRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -540,7 +500,7 @@ func file_auth_proto_init() { | ||||
| 			} | ||||
| 		} | ||||
| 		file_auth_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*IsWorkspaceAuthenticatedRequest); i { | ||||
| 			switch v := v.(*IsValidTokenResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| @@ -585,7 +545,6 @@ 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 { | ||||
| 	IsValidToken(ctx context.Context, in *IsValidTokenRequest, opts ...grpc.CallOption) (*IsValidTokenResponse, error) | ||||
| 	IsWorkspaceAuthenticated(ctx context.Context, in *IsWorkspaceAuthenticatedRequest, opts ...grpc.CallOption) (*empty.Empty, error) | ||||
| 	IsAuthorized(ctx context.Context, in *IsAuthorizedRequest, opts ...grpc.CallOption) (*IsAuthorizedResponse, error) | ||||
| } | ||||
|  | ||||
| @@ -606,15 +565,6 @@ func (c *authServiceClient) IsValidToken(ctx context.Context, in *IsValidTokenRe | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *authServiceClient) IsWorkspaceAuthenticated(ctx context.Context, in *IsWorkspaceAuthenticatedRequest, opts ...grpc.CallOption) (*empty.Empty, error) { | ||||
| 	out := new(empty.Empty) | ||||
| 	err := c.cc.Invoke(ctx, "/api.AuthService/IsWorkspaceAuthenticated", 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...) | ||||
| @@ -627,7 +577,6 @@ func (c *authServiceClient) IsAuthorized(ctx context.Context, in *IsAuthorizedRe | ||||
| // AuthServiceServer is the server API for AuthService service. | ||||
| type AuthServiceServer interface { | ||||
| 	IsValidToken(context.Context, *IsValidTokenRequest) (*IsValidTokenResponse, error) | ||||
| 	IsWorkspaceAuthenticated(context.Context, *IsWorkspaceAuthenticatedRequest) (*empty.Empty, error) | ||||
| 	IsAuthorized(context.Context, *IsAuthorizedRequest) (*IsAuthorizedResponse, error) | ||||
| } | ||||
|  | ||||
| @@ -638,9 +587,6 @@ type UnimplementedAuthServiceServer struct { | ||||
| func (*UnimplementedAuthServiceServer) IsValidToken(context.Context, *IsValidTokenRequest) (*IsValidTokenResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method IsValidToken not implemented") | ||||
| } | ||||
| func (*UnimplementedAuthServiceServer) IsWorkspaceAuthenticated(context.Context, *IsWorkspaceAuthenticatedRequest) (*empty.Empty, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method IsWorkspaceAuthenticated not implemented") | ||||
| } | ||||
| func (*UnimplementedAuthServiceServer) IsAuthorized(context.Context, *IsAuthorizedRequest) (*IsAuthorizedResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method IsAuthorized not implemented") | ||||
| } | ||||
| @@ -667,24 +613,6 @@ func _AuthService_IsValidToken_Handler(srv interface{}, ctx context.Context, dec | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _AuthService_IsWorkspaceAuthenticated_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(IsWorkspaceAuthenticatedRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(AuthServiceServer).IsWorkspaceAuthenticated(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.AuthService/IsWorkspaceAuthenticated", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(AuthServiceServer).IsWorkspaceAuthenticated(ctx, req.(*IsWorkspaceAuthenticatedRequest)) | ||||
| 	} | ||||
| 	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 { | ||||
| @@ -711,10 +639,6 @@ var _AuthService_serviceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "IsValidToken", | ||||
| 			Handler:    _AuthService_IsValidToken_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "IsWorkspaceAuthenticated", | ||||
| 			Handler:    _AuthService_IsWorkspaceAuthenticated_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "IsAuthorized", | ||||
| 			Handler:    _AuthService_IsAuthorized_Handler, | ||||
|   | ||||
| @@ -65,51 +65,15 @@ func local_request_AuthService_IsValidToken_0(ctx context.Context, marshaler run | ||||
|  | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	filter_AuthService_IsWorkspaceAuthenticated_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} | ||||
| ) | ||||
|  | ||||
| func request_AuthService_IsWorkspaceAuthenticated_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq IsWorkspaceAuthenticatedRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	if err := req.ParseForm(); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_IsWorkspaceAuthenticated_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.IsWorkspaceAuthenticated(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_AuthService_IsWorkspaceAuthenticated_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq IsWorkspaceAuthenticatedRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_AuthService_IsWorkspaceAuthenticated_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.IsWorkspaceAuthenticated(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	filter_AuthService_IsAuthorized_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} | ||||
| ) | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 	if err := req.ParseForm(); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_IsAuthorized_0); err != nil { | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.IsAuthorized); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| @@ -122,7 +86,11 @@ func local_request_AuthService_IsAuthorized_0(ctx context.Context, marshaler run | ||||
| 	var protoReq IsAuthorizedRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_AuthService_IsAuthorized_0); err != nil { | ||||
| 	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.IsAuthorized); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| @@ -156,26 +124,6 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("HEAD", pattern_AuthService_IsWorkspaceAuthenticated_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_IsWorkspaceAuthenticated_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_IsWorkspaceAuthenticated_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() | ||||
| @@ -257,26 +205,6 @@ func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("HEAD", pattern_AuthService_IsWorkspaceAuthenticated_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_IsWorkspaceAuthenticated_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_IsWorkspaceAuthenticated_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() | ||||
| @@ -303,15 +231,11 @@ 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_IsWorkspaceAuthenticated_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_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_IsWorkspaceAuthenticated_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_AuthService_IsAuthorized_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
|   | ||||
| @@ -13,23 +13,15 @@ service AuthService { | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc IsWorkspaceAuthenticated(IsWorkspaceAuthenticatedRequest) returns (google.protobuf.Empty) { | ||||
|         option (google.api.http) = { | ||||
|             custom: { | ||||
|                 kind: "HEAD" | ||||
|                 path: "/apis/v1beta1/auth/token" | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc IsAuthorized(IsAuthorizedRequest) returns (IsAuthorizedResponse) { | ||||
|         option (google.api.http) = { | ||||
|             post: "/apis/v1beta1/auth" | ||||
|             body: "isAuthorized" | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| message IsAuthorizedRequest { | ||||
| message IsAuthorized { | ||||
|     string namespace = 1; | ||||
|     string verb = 2; | ||||
|     string group = 3; | ||||
| @@ -37,6 +29,10 @@ message IsAuthorizedRequest { | ||||
|     string resourceName = 5; | ||||
| } | ||||
|  | ||||
| message IsAuthorizedRequest { | ||||
|     IsAuthorized isAuthorized = 1; | ||||
| } | ||||
|  | ||||
| message IsAuthorizedResponse { | ||||
|     bool authorized = 1; | ||||
| } | ||||
| @@ -51,11 +47,4 @@ message IsValidTokenRequest { | ||||
|  | ||||
| message IsValidTokenResponse { | ||||
|     string domain = 1; | ||||
| } | ||||
|  | ||||
| message IsWorkspaceAuthenticatedRequest { | ||||
|     string FQDN = 1; | ||||
|     string XOriginalMethod = 2; | ||||
|     string XOriginalAuthority = 3; | ||||
|     string XOriginalUri = 4; | ||||
| } | ||||
| @@ -36,7 +36,8 @@ type Parameter struct { | ||||
| 	DisplayName string             `protobuf:"bytes,4,opt,name=displayName,proto3" json:"displayName,omitempty"` | ||||
| 	Hint        string             `protobuf:"bytes,5,opt,name=hint,proto3" json:"hint,omitempty"` | ||||
| 	Required    bool               `protobuf:"varint,6,opt,name=required,proto3" json:"required,omitempty"` | ||||
| 	Options     []*ParameterOption `protobuf:"bytes,7,rep,name=options,proto3" json:"options,omitempty"` | ||||
| 	Visibility  string             `protobuf:"bytes,7,opt,name=visibility,proto3" json:"visibility,omitempty"` | ||||
| 	Options     []*ParameterOption `protobuf:"bytes,8,rep,name=options,proto3" json:"options,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *Parameter) Reset() { | ||||
| @@ -113,6 +114,13 @@ func (x *Parameter) GetRequired() bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (x *Parameter) GetVisibility() string { | ||||
| 	if x != nil { | ||||
| 		return x.Visibility | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *Parameter) GetOptions() []*ParameterOption { | ||||
| 	if x != nil { | ||||
| 		return x.Options | ||||
| @@ -179,7 +187,7 @@ var File_common_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_common_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, | ||||
| 	0x61, 0x70, 0x69, 0x22, 0xcb, 0x01, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, | ||||
| 	0x61, 0x70, 0x69, 0x22, 0xeb, 0x01, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, | ||||
| 	0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||
| 	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, | ||||
| @@ -189,7 +197,9 @@ var file_common_proto_rawDesc = []byte{ | ||||
| 	0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||
| 	0x04, 0x68, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, | ||||
| 	0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, | ||||
| 	0x64, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, | ||||
| 	0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, | ||||
| 	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, | ||||
| 	0x79, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, | ||||
| 	0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, | ||||
| 	0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 	0x73, 0x22, 0x3b, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x4f, 0x70, | ||||
|   | ||||
| @@ -9,8 +9,9 @@ message Parameter { | ||||
|     string displayName = 4; | ||||
|     string hint = 5; | ||||
|     bool required = 6; | ||||
|     string visibility = 7; | ||||
|  | ||||
|     repeated ParameterOption options = 7; | ||||
|     repeated ParameterOption options = 8; | ||||
| } | ||||
|  | ||||
| message ParameterOption { | ||||
|   | ||||
							
								
								
									
										422
									
								
								api/config.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										422
									
								
								api/config.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,422 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | ||||
| // versions: | ||||
| // 	protoc-gen-go v1.22.0 | ||||
| // 	protoc        v3.11.4 | ||||
| // source: config.proto | ||||
|  | ||||
| package api | ||||
|  | ||||
| import ( | ||||
| 	context "context" | ||||
| 	proto "github.com/golang/protobuf/proto" | ||||
| 	empty "github.com/golang/protobuf/ptypes/empty" | ||||
| 	_ "google.golang.org/genproto/googleapis/api/annotations" | ||||
| 	grpc "google.golang.org/grpc" | ||||
| 	codes "google.golang.org/grpc/codes" | ||||
| 	status "google.golang.org/grpc/status" | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	reflect "reflect" | ||||
| 	sync "sync" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Verify that this generated code is sufficiently up-to-date. | ||||
| 	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) | ||||
| 	// Verify that runtime/protoimpl is sufficiently up-to-date. | ||||
| 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) | ||||
| ) | ||||
|  | ||||
| // This is a compile-time assertion that a sufficiently up-to-date version | ||||
| // of the legacy proto package is being used. | ||||
| const _ = proto.ProtoPackageIsVersion4 | ||||
|  | ||||
| type GetConfigResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	ApiUrl   string    `protobuf:"bytes,1,opt,name=apiUrl,proto3" json:"apiUrl,omitempty"` | ||||
| 	Domain   string    `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` | ||||
| 	Fqdn     string    `protobuf:"bytes,3,opt,name=fqdn,proto3" json:"fqdn,omitempty"` | ||||
| 	NodePool *NodePool `protobuf:"bytes,4,opt,name=nodePool,proto3" json:"nodePool,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *GetConfigResponse) Reset() { | ||||
| 	*x = GetConfigResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_config_proto_msgTypes[0] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *GetConfigResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*GetConfigResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetConfigResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_config_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 GetConfigResponse.ProtoReflect.Descriptor instead. | ||||
| func (*GetConfigResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_config_proto_rawDescGZIP(), []int{0} | ||||
| } | ||||
|  | ||||
| func (x *GetConfigResponse) GetApiUrl() string { | ||||
| 	if x != nil { | ||||
| 		return x.ApiUrl | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetConfigResponse) GetDomain() string { | ||||
| 	if x != nil { | ||||
| 		return x.Domain | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetConfigResponse) GetFqdn() string { | ||||
| 	if x != nil { | ||||
| 		return x.Fqdn | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetConfigResponse) GetNodePool() *NodePool { | ||||
| 	if x != nil { | ||||
| 		return x.NodePool | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type NodePoolOption struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Name  string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` | ||||
| 	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *NodePoolOption) Reset() { | ||||
| 	*x = NodePoolOption{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_config_proto_msgTypes[1] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *NodePoolOption) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*NodePoolOption) ProtoMessage() {} | ||||
|  | ||||
| func (x *NodePoolOption) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_config_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 NodePoolOption.ProtoReflect.Descriptor instead. | ||||
| func (*NodePoolOption) Descriptor() ([]byte, []int) { | ||||
| 	return file_config_proto_rawDescGZIP(), []int{1} | ||||
| } | ||||
|  | ||||
| func (x *NodePoolOption) GetName() string { | ||||
| 	if x != nil { | ||||
| 		return x.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *NodePoolOption) GetValue() string { | ||||
| 	if x != nil { | ||||
| 		return x.Value | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type NodePool struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Label   string            `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` | ||||
| 	Options []*NodePoolOption `protobuf:"bytes,2,rep,name=options,proto3" json:"options,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *NodePool) Reset() { | ||||
| 	*x = NodePool{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_config_proto_msgTypes[2] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *NodePool) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*NodePool) ProtoMessage() {} | ||||
|  | ||||
| func (x *NodePool) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_config_proto_msgTypes[2] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use NodePool.ProtoReflect.Descriptor instead. | ||||
| func (*NodePool) Descriptor() ([]byte, []int) { | ||||
| 	return file_config_proto_rawDescGZIP(), []int{2} | ||||
| } | ||||
|  | ||||
| func (x *NodePool) GetLabel() string { | ||||
| 	if x != nil { | ||||
| 		return x.Label | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *NodePool) GetOptions() []*NodePoolOption { | ||||
| 	if x != nil { | ||||
| 		return x.Options | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var File_config_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_config_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x82, | ||||
| 	0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, | ||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x55, 0x72, 0x6c, 0x18, 0x01, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x70, 0x69, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, | ||||
| 	0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, | ||||
| 	0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x03, 0x20, 0x01, | ||||
| 	0x28, 0x09, 0x52, 0x04, 0x66, 0x71, 0x64, 0x6e, 0x12, 0x29, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, | ||||
| 	0x50, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x50, | ||||
| 	0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, | ||||
| 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, | ||||
| 	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, | ||||
| 	0x4f, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6c, | ||||
| 	0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, | ||||
| 	0x6c, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, | ||||
| 	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, | ||||
| 	0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, | ||||
| 	0x32, 0x6a, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||
| 	0x65, 0x12, 0x59, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, | ||||
| 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | ||||
| 	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, | ||||
| 	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, | ||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, | ||||
| 	0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	file_config_proto_rawDescOnce sync.Once | ||||
| 	file_config_proto_rawDescData = file_config_proto_rawDesc | ||||
| ) | ||||
|  | ||||
| func file_config_proto_rawDescGZIP() []byte { | ||||
| 	file_config_proto_rawDescOnce.Do(func() { | ||||
| 		file_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_config_proto_rawDescData) | ||||
| 	}) | ||||
| 	return file_config_proto_rawDescData | ||||
| } | ||||
|  | ||||
| var file_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) | ||||
| var file_config_proto_goTypes = []interface{}{ | ||||
| 	(*GetConfigResponse)(nil), // 0: api.GetConfigResponse | ||||
| 	(*NodePoolOption)(nil),    // 1: api.NodePoolOption | ||||
| 	(*NodePool)(nil),          // 2: api.NodePool | ||||
| 	(*empty.Empty)(nil),       // 3: google.protobuf.Empty | ||||
| } | ||||
| var file_config_proto_depIdxs = []int32{ | ||||
| 	2, // 0: api.GetConfigResponse.nodePool:type_name -> api.NodePool | ||||
| 	1, // 1: api.NodePool.options:type_name -> api.NodePoolOption | ||||
| 	3, // 2: api.ConfigService.GetConfig:input_type -> google.protobuf.Empty | ||||
| 	0, // 3: api.ConfigService.GetConfig:output_type -> api.GetConfigResponse | ||||
| 	3, // [3:4] is the sub-list for method output_type | ||||
| 	2, // [2:3] is the sub-list for method input_type | ||||
| 	2, // [2:2] is the sub-list for extension type_name | ||||
| 	2, // [2:2] is the sub-list for extension extendee | ||||
| 	0, // [0:2] is the sub-list for field type_name | ||||
| } | ||||
|  | ||||
| func init() { file_config_proto_init() } | ||||
| func file_config_proto_init() { | ||||
| 	if File_config_proto != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if !protoimpl.UnsafeEnabled { | ||||
| 		file_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetConfigResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*NodePoolOption); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*NodePool); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| 		File: protoimpl.DescBuilder{ | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_config_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   3, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   1, | ||||
| 		}, | ||||
| 		GoTypes:           file_config_proto_goTypes, | ||||
| 		DependencyIndexes: file_config_proto_depIdxs, | ||||
| 		MessageInfos:      file_config_proto_msgTypes, | ||||
| 	}.Build() | ||||
| 	File_config_proto = out.File | ||||
| 	file_config_proto_rawDesc = nil | ||||
| 	file_config_proto_goTypes = nil | ||||
| 	file_config_proto_depIdxs = nil | ||||
| } | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ context.Context | ||||
| var _ grpc.ClientConnInterface | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the grpc package it is being compiled against. | ||||
| const _ = grpc.SupportPackageIsVersion6 | ||||
|  | ||||
| // ConfigServiceClient is the client API for ConfigService service. | ||||
| // | ||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. | ||||
| type ConfigServiceClient interface { | ||||
| 	GetConfig(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetConfigResponse, error) | ||||
| } | ||||
|  | ||||
| type configServiceClient struct { | ||||
| 	cc grpc.ClientConnInterface | ||||
| } | ||||
|  | ||||
| func NewConfigServiceClient(cc grpc.ClientConnInterface) ConfigServiceClient { | ||||
| 	return &configServiceClient{cc} | ||||
| } | ||||
|  | ||||
| func (c *configServiceClient) GetConfig(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetConfigResponse, error) { | ||||
| 	out := new(GetConfigResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.ConfigService/GetConfig", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| // ConfigServiceServer is the server API for ConfigService service. | ||||
| type ConfigServiceServer interface { | ||||
| 	GetConfig(context.Context, *empty.Empty) (*GetConfigResponse, error) | ||||
| } | ||||
|  | ||||
| // UnimplementedConfigServiceServer can be embedded to have forward compatible implementations. | ||||
| type UnimplementedConfigServiceServer struct { | ||||
| } | ||||
|  | ||||
| func (*UnimplementedConfigServiceServer) GetConfig(context.Context, *empty.Empty) (*GetConfigResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetConfig not implemented") | ||||
| } | ||||
|  | ||||
| func RegisterConfigServiceServer(s *grpc.Server, srv ConfigServiceServer) { | ||||
| 	s.RegisterService(&_ConfigService_serviceDesc, srv) | ||||
| } | ||||
|  | ||||
| func _ConfigService_GetConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(empty.Empty) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(ConfigServiceServer).GetConfig(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.ConfigService/GetConfig", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(ConfigServiceServer).GetConfig(ctx, req.(*empty.Empty)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| var _ConfigService_serviceDesc = grpc.ServiceDesc{ | ||||
| 	ServiceName: "api.ConfigService", | ||||
| 	HandlerType: (*ConfigServiceServer)(nil), | ||||
| 	Methods: []grpc.MethodDesc{ | ||||
| 		{ | ||||
| 			MethodName: "GetConfig", | ||||
| 			Handler:    _ConfigService_GetConfig_Handler, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Streams:  []grpc.StreamDesc{}, | ||||
| 	Metadata: "config.proto", | ||||
| } | ||||
							
								
								
									
										148
									
								
								api/config.pb.gw.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								api/config.pb.gw.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. | ||||
| // source: config.proto | ||||
|  | ||||
| /* | ||||
| Package api is a reverse proxy. | ||||
|  | ||||
| It translates gRPC into RESTful JSON APIs. | ||||
| */ | ||||
| package api | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/golang/protobuf/descriptor" | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/golang/protobuf/ptypes/empty" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/runtime" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/utilities" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/grpc/status" | ||||
| ) | ||||
|  | ||||
| // Suppress "imported and not used" errors | ||||
| var _ codes.Code | ||||
| var _ io.Reader | ||||
| var _ status.Status | ||||
| var _ = runtime.String | ||||
| var _ = utilities.NewDoubleArray | ||||
| var _ = descriptor.ForMessage | ||||
|  | ||||
| func request_ConfigService_GetConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq empty.Empty | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	msg, err := client.GetConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_ConfigService_GetConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq empty.Empty | ||||
| 	var metadata runtime.ServerMetadata | ||||
|  | ||||
| 	msg, err := server.GetConfig(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| // RegisterConfigServiceHandlerServer registers the http handlers for service ConfigService to "mux". | ||||
| // UnaryRPC     :call ConfigServiceServer directly. | ||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. | ||||
| func RegisterConfigServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConfigServiceServer) error { | ||||
|  | ||||
| 	mux.Handle("GET", pattern_ConfigService_GetConfig_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_ConfigService_GetConfig_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_ConfigService_GetConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // RegisterConfigServiceHandlerFromEndpoint is same as RegisterConfigServiceHandler but | ||||
| // automatically dials to "endpoint" and closes the connection when "ctx" gets done. | ||||
| func RegisterConfigServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { | ||||
| 	conn, err := grpc.Dial(endpoint, opts...) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			if cerr := conn.Close(); cerr != nil { | ||||
| 				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 		go func() { | ||||
| 			<-ctx.Done() | ||||
| 			if cerr := conn.Close(); cerr != nil { | ||||
| 				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) | ||||
| 			} | ||||
| 		}() | ||||
| 	}() | ||||
|  | ||||
| 	return RegisterConfigServiceHandler(ctx, mux, conn) | ||||
| } | ||||
|  | ||||
| // RegisterConfigServiceHandler registers the http handlers for service ConfigService to "mux". | ||||
| // The handlers forward requests to the grpc endpoint over "conn". | ||||
| func RegisterConfigServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { | ||||
| 	return RegisterConfigServiceHandlerClient(ctx, mux, NewConfigServiceClient(conn)) | ||||
| } | ||||
|  | ||||
| // RegisterConfigServiceHandlerClient registers the http handlers for service ConfigService | ||||
| // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ConfigServiceClient". | ||||
| // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ConfigServiceClient" | ||||
| // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in | ||||
| // "ConfigServiceClient" to call the correct interceptors. | ||||
| func RegisterConfigServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConfigServiceClient) error { | ||||
|  | ||||
| 	mux.Handle("GET", pattern_ConfigService_GetConfig_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_ConfigService_GetConfig_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_ConfigService_GetConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	pattern_ConfigService_GetConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"apis", "v1beta1", "config"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	forward_ConfigService_GetConfig_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
							
								
								
									
										31
									
								
								api/config.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								api/config.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package api; | ||||
|  | ||||
| import "google/api/annotations.proto"; | ||||
| import "google/protobuf/empty.proto"; | ||||
|  | ||||
| service ConfigService { | ||||
|     rpc GetConfig (google.protobuf.Empty) returns (GetConfigResponse) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/config" | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| message GetConfigResponse { | ||||
|     string apiUrl = 1; | ||||
|     string domain = 2; | ||||
|     string fqdn = 3; | ||||
|     NodePool nodePool = 4; | ||||
| } | ||||
|  | ||||
| message NodePoolOption { | ||||
|     string name = 1; | ||||
|     string value = 2; | ||||
| } | ||||
|  | ||||
| message NodePool { | ||||
|     string label  = 1; | ||||
|     repeated NodePoolOption options = 2; | ||||
| } | ||||
							
								
								
									
										557
									
								
								api/services.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										557
									
								
								api/services.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,557 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | ||||
| // versions: | ||||
| // 	protoc-gen-go v1.22.0 | ||||
| // 	protoc        v3.11.4 | ||||
| // source: services.proto | ||||
|  | ||||
| package api | ||||
|  | ||||
| import ( | ||||
| 	context "context" | ||||
| 	proto "github.com/golang/protobuf/proto" | ||||
| 	_ "github.com/golang/protobuf/ptypes/empty" | ||||
| 	_ "google.golang.org/genproto/googleapis/api/annotations" | ||||
| 	grpc "google.golang.org/grpc" | ||||
| 	codes "google.golang.org/grpc/codes" | ||||
| 	status "google.golang.org/grpc/status" | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	reflect "reflect" | ||||
| 	sync "sync" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Verify that this generated code is sufficiently up-to-date. | ||||
| 	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) | ||||
| 	// Verify that runtime/protoimpl is sufficiently up-to-date. | ||||
| 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) | ||||
| ) | ||||
|  | ||||
| // This is a compile-time assertion that a sufficiently up-to-date version | ||||
| // of the legacy proto package is being used. | ||||
| const _ = proto.ProtoPackageIsVersion4 | ||||
|  | ||||
| type Service struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` | ||||
| 	Url  string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *Service) Reset() { | ||||
| 	*x = Service{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_services_proto_msgTypes[0] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *Service) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*Service) ProtoMessage() {} | ||||
|  | ||||
| func (x *Service) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_services_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 Service.ProtoReflect.Descriptor instead. | ||||
| func (*Service) Descriptor() ([]byte, []int) { | ||||
| 	return file_services_proto_rawDescGZIP(), []int{0} | ||||
| } | ||||
|  | ||||
| func (x *Service) GetName() string { | ||||
| 	if x != nil { | ||||
| 		return x.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *Service) GetUrl() string { | ||||
| 	if x != nil { | ||||
| 		return x.Url | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type GetServiceRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	Name      string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *GetServiceRequest) Reset() { | ||||
| 	*x = GetServiceRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_services_proto_msgTypes[1] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *GetServiceRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*GetServiceRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetServiceRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_services_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 GetServiceRequest.ProtoReflect.Descriptor instead. | ||||
| func (*GetServiceRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_services_proto_rawDescGZIP(), []int{1} | ||||
| } | ||||
|  | ||||
| func (x *GetServiceRequest) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *GetServiceRequest) GetName() string { | ||||
| 	if x != nil { | ||||
| 		return x.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type ListServicesRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	PageSize  int32  `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize,omitempty"` | ||||
| 	Page      int32  `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *ListServicesRequest) Reset() { | ||||
| 	*x = ListServicesRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_services_proto_msgTypes[2] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *ListServicesRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*ListServicesRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_services_proto_msgTypes[2] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use ListServicesRequest.ProtoReflect.Descriptor instead. | ||||
| func (*ListServicesRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_services_proto_rawDescGZIP(), []int{2} | ||||
| } | ||||
|  | ||||
| func (x *ListServicesRequest) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *ListServicesRequest) GetPageSize() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.PageSize | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListServicesRequest) GetPage() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Page | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type ListServicesResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Count      int32      `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` | ||||
| 	Services   []*Service `protobuf:"bytes,2,rep,name=services,proto3" json:"services,omitempty"` | ||||
| 	Page       int32      `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` | ||||
| 	Pages      int32      `protobuf:"varint,4,opt,name=pages,proto3" json:"pages,omitempty"` | ||||
| 	TotalCount int32      `protobuf:"varint,5,opt,name=totalCount,proto3" json:"totalCount,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) Reset() { | ||||
| 	*x = ListServicesResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_services_proto_msgTypes[3] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*ListServicesResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_services_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 ListServicesResponse.ProtoReflect.Descriptor instead. | ||||
| func (*ListServicesResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_services_proto_rawDescGZIP(), []int{3} | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) GetCount() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Count | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) GetServices() []*Service { | ||||
| 	if x != nil { | ||||
| 		return x.Services | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) GetPage() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Page | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) GetPages() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Pages | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListServicesResponse) GetTotalCount() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.TotalCount | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| var File_services_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_services_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 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, 0x2f, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, | ||||
| 	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, | ||||
| 	0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, | ||||
| 	0x6c, 0x22, 0x45, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, | ||||
| 	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x63, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, | ||||
| 	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, | ||||
| 	0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, | ||||
| 	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xa0, 0x01, | ||||
| 	0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, | ||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, | ||||
| 	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x08, | ||||
| 	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, | ||||
| 	0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, | ||||
| 	0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, | ||||
| 	0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, | ||||
| 	0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, | ||||
| 	0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, | ||||
| 	0x32, 0xe6, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, | ||||
| 	0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||
| 	0x65, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, | ||||
| 	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, | ||||
| 	0x28, 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, 0x73, 0x65, 0x72, 0x76, 0x69, | ||||
| 	0x63, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x6e, 0x0a, 0x0c, 0x4c, 0x69, 0x73, | ||||
| 	0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, | ||||
| 	0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, | ||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 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, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	file_services_proto_rawDescOnce sync.Once | ||||
| 	file_services_proto_rawDescData = file_services_proto_rawDesc | ||||
| ) | ||||
|  | ||||
| func file_services_proto_rawDescGZIP() []byte { | ||||
| 	file_services_proto_rawDescOnce.Do(func() { | ||||
| 		file_services_proto_rawDescData = protoimpl.X.CompressGZIP(file_services_proto_rawDescData) | ||||
| 	}) | ||||
| 	return file_services_proto_rawDescData | ||||
| } | ||||
|  | ||||
| var file_services_proto_msgTypes = make([]protoimpl.MessageInfo, 4) | ||||
| var file_services_proto_goTypes = []interface{}{ | ||||
| 	(*Service)(nil),              // 0: api.Service | ||||
| 	(*GetServiceRequest)(nil),    // 1: api.GetServiceRequest | ||||
| 	(*ListServicesRequest)(nil),  // 2: api.ListServicesRequest | ||||
| 	(*ListServicesResponse)(nil), // 3: api.ListServicesResponse | ||||
| } | ||||
| var file_services_proto_depIdxs = []int32{ | ||||
| 	0, // 0: api.ListServicesResponse.services:type_name -> api.Service | ||||
| 	1, // 1: api.ServiceService.GetService:input_type -> api.GetServiceRequest | ||||
| 	2, // 2: api.ServiceService.ListServices:input_type -> api.ListServicesRequest | ||||
| 	0, // 3: api.ServiceService.GetService:output_type -> api.Service | ||||
| 	3, // 4: api.ServiceService.ListServices:output_type -> api.ListServicesResponse | ||||
| 	3, // [3:5] is the sub-list for method output_type | ||||
| 	1, // [1:3] 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_services_proto_init() } | ||||
| func file_services_proto_init() { | ||||
| 	if File_services_proto != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if !protoimpl.UnsafeEnabled { | ||||
| 		file_services_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*Service); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_services_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetServiceRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_services_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*ListServicesRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_services_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*ListServicesResponse); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| 		File: protoimpl.DescBuilder{ | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_services_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   4, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   1, | ||||
| 		}, | ||||
| 		GoTypes:           file_services_proto_goTypes, | ||||
| 		DependencyIndexes: file_services_proto_depIdxs, | ||||
| 		MessageInfos:      file_services_proto_msgTypes, | ||||
| 	}.Build() | ||||
| 	File_services_proto = out.File | ||||
| 	file_services_proto_rawDesc = nil | ||||
| 	file_services_proto_goTypes = nil | ||||
| 	file_services_proto_depIdxs = nil | ||||
| } | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ context.Context | ||||
| var _ grpc.ClientConnInterface | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the grpc package it is being compiled against. | ||||
| const _ = grpc.SupportPackageIsVersion6 | ||||
|  | ||||
| // ServiceServiceClient is the client API for ServiceService service. | ||||
| // | ||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. | ||||
| type ServiceServiceClient interface { | ||||
| 	GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) | ||||
| 	ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) | ||||
| } | ||||
|  | ||||
| type serviceServiceClient struct { | ||||
| 	cc grpc.ClientConnInterface | ||||
| } | ||||
|  | ||||
| func NewServiceServiceClient(cc grpc.ClientConnInterface) ServiceServiceClient { | ||||
| 	return &serviceServiceClient{cc} | ||||
| } | ||||
|  | ||||
| func (c *serviceServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) { | ||||
| 	out := new(Service) | ||||
| 	err := c.cc.Invoke(ctx, "/api.ServiceService/GetService", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *serviceServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) { | ||||
| 	out := new(ListServicesResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.ServiceService/ListServices", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| // ServiceServiceServer is the server API for ServiceService service. | ||||
| type ServiceServiceServer interface { | ||||
| 	GetService(context.Context, *GetServiceRequest) (*Service, error) | ||||
| 	ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) | ||||
| } | ||||
|  | ||||
| // UnimplementedServiceServiceServer can be embedded to have forward compatible implementations. | ||||
| type UnimplementedServiceServiceServer struct { | ||||
| } | ||||
|  | ||||
| func (*UnimplementedServiceServiceServer) GetService(context.Context, *GetServiceRequest) (*Service, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetService not implemented") | ||||
| } | ||||
| func (*UnimplementedServiceServiceServer) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method ListServices not implemented") | ||||
| } | ||||
|  | ||||
| func RegisterServiceServiceServer(s *grpc.Server, srv ServiceServiceServer) { | ||||
| 	s.RegisterService(&_ServiceService_serviceDesc, srv) | ||||
| } | ||||
|  | ||||
| func _ServiceService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetServiceRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(ServiceServiceServer).GetService(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.ServiceService/GetService", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(ServiceServiceServer).GetService(ctx, req.(*GetServiceRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _ServiceService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(ListServicesRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(ServiceServiceServer).ListServices(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.ServiceService/ListServices", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(ServiceServiceServer).ListServices(ctx, req.(*ListServicesRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| var _ServiceService_serviceDesc = grpc.ServiceDesc{ | ||||
| 	ServiceName: "api.ServiceService", | ||||
| 	HandlerType: (*ServiceServiceServer)(nil), | ||||
| 	Methods: []grpc.MethodDesc{ | ||||
| 		{ | ||||
| 			MethodName: "GetService", | ||||
| 			Handler:    _ServiceService_GetService_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "ListServices", | ||||
| 			Handler:    _ServiceService_ListServices_Handler, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Streams:  []grpc.StreamDesc{}, | ||||
| 	Metadata: "services.proto", | ||||
| } | ||||
							
								
								
									
										318
									
								
								api/services.pb.gw.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								api/services.pb.gw.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,318 @@ | ||||
| // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. | ||||
| // source: services.proto | ||||
|  | ||||
| /* | ||||
| Package api is a reverse proxy. | ||||
|  | ||||
| It translates gRPC into RESTful JSON APIs. | ||||
| */ | ||||
| package api | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/golang/protobuf/descriptor" | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/runtime" | ||||
| 	"github.com/grpc-ecosystem/grpc-gateway/utilities" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/grpclog" | ||||
| 	"google.golang.org/grpc/status" | ||||
| ) | ||||
|  | ||||
| // Suppress "imported and not used" errors | ||||
| var _ codes.Code | ||||
| var _ io.Reader | ||||
| var _ status.Status | ||||
| var _ = runtime.String | ||||
| var _ = utilities.NewDoubleArray | ||||
| var _ = descriptor.ForMessage | ||||
|  | ||||
| func request_ServiceService_GetService_0(ctx context.Context, marshaler runtime.Marshaler, client ServiceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetServiceRequest | ||||
| 	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["name"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Name, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.GetService(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_ServiceService_GetService_0(ctx context.Context, marshaler runtime.Marshaler, server ServiceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetServiceRequest | ||||
| 	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["name"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") | ||||
| 	} | ||||
|  | ||||
| 	protoReq.Name, err = runtime.String(val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.GetService(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	filter_ServiceService_ListServices_0 = &utilities.DoubleArray{Encoding: map[string]int{"namespace": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} | ||||
| ) | ||||
|  | ||||
| func request_ServiceService_ListServices_0(ctx context.Context, marshaler runtime.Marshaler, client ServiceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq ListServicesRequest | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	if err := req.ParseForm(); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ServiceService_ListServices_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.ListServices(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_ServiceService_ListServices_0(ctx context.Context, marshaler runtime.Marshaler, server ServiceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq ListServicesRequest | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_ServiceService_ListServices_0); err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.ListServices(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| // RegisterServiceServiceHandlerServer registers the http handlers for service ServiceService to "mux". | ||||
| // UnaryRPC     :call ServiceServiceServer directly. | ||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. | ||||
| func RegisterServiceServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ServiceServiceServer) error { | ||||
|  | ||||
| 	mux.Handle("GET", pattern_ServiceService_GetService_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_ServiceService_GetService_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_ServiceService_GetService_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_ServiceService_ListServices_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_ServiceService_ListServices_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_ServiceService_ListServices_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // RegisterServiceServiceHandlerFromEndpoint is same as RegisterServiceServiceHandler but | ||||
| // automatically dials to "endpoint" and closes the connection when "ctx" gets done. | ||||
| func RegisterServiceServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { | ||||
| 	conn, err := grpc.Dial(endpoint, opts...) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			if cerr := conn.Close(); cerr != nil { | ||||
| 				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 		go func() { | ||||
| 			<-ctx.Done() | ||||
| 			if cerr := conn.Close(); cerr != nil { | ||||
| 				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) | ||||
| 			} | ||||
| 		}() | ||||
| 	}() | ||||
|  | ||||
| 	return RegisterServiceServiceHandler(ctx, mux, conn) | ||||
| } | ||||
|  | ||||
| // RegisterServiceServiceHandler registers the http handlers for service ServiceService to "mux". | ||||
| // The handlers forward requests to the grpc endpoint over "conn". | ||||
| func RegisterServiceServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { | ||||
| 	return RegisterServiceServiceHandlerClient(ctx, mux, NewServiceServiceClient(conn)) | ||||
| } | ||||
|  | ||||
| // RegisterServiceServiceHandlerClient registers the http handlers for service ServiceService | ||||
| // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ServiceServiceClient". | ||||
| // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ServiceServiceClient" | ||||
| // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in | ||||
| // "ServiceServiceClient" to call the correct interceptors. | ||||
| func RegisterServiceServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ServiceServiceClient) error { | ||||
|  | ||||
| 	mux.Handle("GET", pattern_ServiceService_GetService_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_ServiceService_GetService_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_ServiceService_GetService_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_ServiceService_ListServices_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_ServiceService_ListServices_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_ServiceService_ListServices_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	pattern_ServiceService_GetService_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}, []string{"apis", "v1beta1", "namespace", "service", "name"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_ServiceService_ListServices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "service"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	forward_ServiceService_GetService_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_ServiceService_ListServices_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
							
								
								
									
										44
									
								
								api/services.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								api/services.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package api; | ||||
|  | ||||
| import "google/api/annotations.proto"; | ||||
| import "google/protobuf/empty.proto"; | ||||
|  | ||||
| service ServiceService { | ||||
|     rpc GetService(GetServiceRequest) returns (Service) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/service/{name}" | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc ListServices(ListServicesRequest) returns (ListServicesResponse) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/service" | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| message Service { | ||||
|     string name = 1; | ||||
|     string url = 2; | ||||
| } | ||||
|  | ||||
| message GetServiceRequest { | ||||
|     string namespace = 1; | ||||
|     string name = 2; | ||||
| } | ||||
|  | ||||
| message ListServicesRequest { | ||||
|     string namespace = 1; | ||||
|     int32 pageSize = 2; | ||||
|     int32 page = 3; | ||||
| } | ||||
|  | ||||
| message ListServicesResponse { | ||||
|     int32 count = 1; | ||||
|     repeated Service services = 2; | ||||
|     int32 page = 3; | ||||
|     int32 pages = 4; | ||||
|     int32 totalCount = 5; | ||||
| } | ||||
							
								
								
									
										1019
									
								
								api/workflow.pb.go
									
									
									
									
									
								
							
							
						
						
									
										1019
									
								
								api/workflow.pb.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -177,6 +177,60 @@ func local_request_WorkflowService_CloneWorkflowExecution_0(ctx context.Context, | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkflowService_GetWorkflowExecutionStatisticsForNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetWorkflowExecutionStatisticsForNamespaceRequest | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.GetWorkflowExecutionStatisticsForNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_WorkflowService_GetWorkflowExecutionStatisticsForNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetWorkflowExecutionStatisticsForNamespaceRequest | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.GetWorkflowExecutionStatisticsForNamespace(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkflowService_GetWorkflowExecution_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetWorkflowExecutionRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| @@ -1203,6 +1257,26 @@ func RegisterWorkflowServiceHandlerServer(ctx context.Context, mux *runtime.Serv | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkflowService_GetWorkflowExecutionStatisticsForNamespace_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_GetWorkflowExecutionStatisticsForNamespace_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_GetWorkflowExecutionStatisticsForNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkflowService_GetWorkflowExecution_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -1498,6 +1572,26 @@ func RegisterWorkflowServiceHandlerClient(ctx context.Context, mux *runtime.Serv | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkflowService_GetWorkflowExecutionStatisticsForNamespace_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_GetWorkflowExecutionStatisticsForNamespace_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_GetWorkflowExecutionStatisticsForNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkflowService_GetWorkflowExecution_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -1746,6 +1840,8 @@ var ( | ||||
|  | ||||
| 	pattern_WorkflowService_CloneWorkflowExecution_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}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "uid"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowService_GetWorkflowExecutionStatisticsForNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "statistics"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowService_GetWorkflowExecution_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}, []string{"apis", "v1beta1", "namespace", "workflow_executions", "uid"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowService_ListWorkflowExecutions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflow_executions"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| @@ -1776,6 +1872,8 @@ var ( | ||||
|  | ||||
| 	forward_WorkflowService_CloneWorkflowExecution_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowService_GetWorkflowExecutionStatisticsForNamespace_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowService_GetWorkflowExecution_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowService_ListWorkflowExecutions_0 = runtime.ForwardResponseMessage | ||||
|   | ||||
| @@ -25,6 +25,12 @@ service WorkflowService { | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc GetWorkflowExecutionStatisticsForNamespace (GetWorkflowExecutionStatisticsForNamespaceRequest) returns (GetWorkflowExecutionStatisticsForNamespaceResponse) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/workflow_executions/statistics" | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc GetWorkflowExecution (GetWorkflowExecutionRequest) returns (WorkflowExecution) { | ||||
|         option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/workflow_executions/{uid}" | ||||
| @@ -169,6 +175,10 @@ message ListWorkflowExecutionsRequest { | ||||
|     string workflowTemplateVersion = 3; | ||||
|     int32 pageSize = 4; | ||||
|     int32 page = 5; | ||||
|     string order = 6; | ||||
|     string labels = 7; | ||||
|     string phase = 8; | ||||
|     bool includeSystem = 9; | ||||
| } | ||||
|  | ||||
| message ListWorkflowExecutionsResponse { | ||||
| @@ -184,6 +194,10 @@ message LogEntry { | ||||
|     string content = 2; | ||||
| } | ||||
|  | ||||
| message WorkflowExecutionMetadata { | ||||
|     string url = 1; | ||||
| } | ||||
|  | ||||
| message WorkflowExecution { | ||||
|     string createdAt = 1; | ||||
|     string uid = 2; | ||||
| @@ -198,6 +212,8 @@ message WorkflowExecution { | ||||
|     WorkflowTemplate workflowTemplate = 9; | ||||
|  | ||||
|     repeated KeyValue labels = 10; | ||||
|  | ||||
|     WorkflowExecutionMetadata metadata = 11; | ||||
| } | ||||
|  | ||||
| message ArtifactResponse { | ||||
| @@ -250,4 +266,12 @@ message UpdateWorkflowExecutionStatusRequest { | ||||
|     string namespace = 1; | ||||
|     string uid = 2; | ||||
|     WorkflowExecutionStatus status = 3; | ||||
| } | ||||
|  | ||||
| message GetWorkflowExecutionStatisticsForNamespaceRequest { | ||||
|     string namespace = 1; | ||||
| } | ||||
|  | ||||
| message GetWorkflowExecutionStatisticsForNamespaceResponse { | ||||
|     WorkflowExecutionStatisticReport stats = 1; | ||||
| } | ||||
| @@ -392,6 +392,7 @@ type ListWorkflowTemplatesRequest struct { | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	PageSize  int32  `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize,omitempty"` | ||||
| 	Page      int32  `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` | ||||
| 	Labels    string `protobuf:"bytes,4,opt,name=labels,proto3" json:"labels,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *ListWorkflowTemplatesRequest) Reset() { | ||||
| @@ -447,6 +448,13 @@ func (x *ListWorkflowTemplatesRequest) GetPage() int32 { | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListWorkflowTemplatesRequest) GetLabels() string { | ||||
| 	if x != nil { | ||||
| 		return x.Labels | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type ListWorkflowTemplatesResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -768,16 +776,18 @@ type WorkflowTemplate struct { | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	CreatedAt  string                            `protobuf:"bytes,1,opt,name=createdAt,proto3" json:"createdAt,omitempty"` | ||||
| 	Uid        string                            `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` | ||||
| 	Name       string                            `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` | ||||
| 	Version    int64                             `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` | ||||
| 	Versions   int64                             `protobuf:"varint,5,opt,name=versions,proto3" json:"versions,omitempty"` | ||||
| 	Manifest   string                            `protobuf:"bytes,6,opt,name=manifest,proto3" json:"manifest,omitempty"` | ||||
| 	IsLatest   bool                              `protobuf:"varint,7,opt,name=isLatest,proto3" json:"isLatest,omitempty"` | ||||
| 	IsArchived bool                              `protobuf:"varint,8,opt,name=isArchived,proto3" json:"isArchived,omitempty"` | ||||
| 	Labels     []*KeyValue                       `protobuf:"bytes,9,rep,name=labels,proto3" json:"labels,omitempty"` | ||||
| 	Stats      *WorkflowExecutionStatisticReport `protobuf:"bytes,10,opt,name=stats,proto3" json:"stats,omitempty"` | ||||
| 	CronStats  *CronWorkflowStatisticsReport     `protobuf:"bytes,11,opt,name=cronStats,proto3" json:"cronStats,omitempty"` | ||||
| 	ModifiedAt string                            `protobuf:"bytes,2,opt,name=modifiedAt,proto3" json:"modifiedAt,omitempty"` | ||||
| 	Uid        string                            `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` | ||||
| 	Name       string                            `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` | ||||
| 	Version    int64                             `protobuf:"varint,5,opt,name=version,proto3" json:"version,omitempty"` | ||||
| 	Versions   int64                             `protobuf:"varint,6,opt,name=versions,proto3" json:"versions,omitempty"` | ||||
| 	Manifest   string                            `protobuf:"bytes,7,opt,name=manifest,proto3" json:"manifest,omitempty"` | ||||
| 	IsLatest   bool                              `protobuf:"varint,8,opt,name=isLatest,proto3" json:"isLatest,omitempty"` | ||||
| 	IsArchived bool                              `protobuf:"varint,9,opt,name=isArchived,proto3" json:"isArchived,omitempty"` | ||||
| 	Labels     []*KeyValue                       `protobuf:"bytes,10,rep,name=labels,proto3" json:"labels,omitempty"` | ||||
| 	Stats      *WorkflowExecutionStatisticReport `protobuf:"bytes,11,opt,name=stats,proto3" json:"stats,omitempty"` | ||||
| 	CronStats  *CronWorkflowStatisticsReport     `protobuf:"bytes,12,opt,name=cronStats,proto3" json:"cronStats,omitempty"` | ||||
| 	Parameters []*Parameter                      `protobuf:"bytes,13,rep,name=parameters,proto3" json:"parameters,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *WorkflowTemplate) Reset() { | ||||
| @@ -819,6 +829,13 @@ func (x *WorkflowTemplate) GetCreatedAt() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *WorkflowTemplate) GetModifiedAt() string { | ||||
| 	if x != nil { | ||||
| 		return x.ModifiedAt | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *WorkflowTemplate) GetUid() string { | ||||
| 	if x != nil { | ||||
| 		return x.Uid | ||||
| @@ -889,6 +906,13 @@ func (x *WorkflowTemplate) GetCronStats() *CronWorkflowStatisticsReport { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (x *WorkflowTemplate) GetParameters() []*Parameter { | ||||
| 	if x != nil { | ||||
| 		return x.Parameters | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type GetWorkflowTemplateLabelsRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -959,230 +983,223 @@ var file_workflow_template_proto_rawDesc = []byte{ | ||||
| 	0x61, 0x74, 0x65, 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, 0x0b, 0x6c, 0x61, | ||||
| 	0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x43, 0x72, | ||||
| 	0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, | ||||
| 	0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x87, 0x01, 0x0a, | ||||
| 	0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||
| 	0x03, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, | ||||
| 	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7c, | ||||
| 	0x0a, 0x1c, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, | ||||
| 	0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, | ||||
| 	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, | ||||
| 	0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x23, | ||||
| 	0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, | ||||
| 	0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, | ||||
| 	0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 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, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, | ||||
| 	0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x24, 0x55, | ||||
| 	0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, | ||||
| 	0x75, 0x69, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, | ||||
| 	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, | ||||
| 	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, | ||||
| 	0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x6c, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, | ||||
| 	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, | ||||
| 	0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, | ||||
| 	0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, | ||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, | ||||
| 	0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, | ||||
| 	0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, | ||||
| 	0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, | ||||
| 	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x1e, | ||||
| 	0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, | ||||
| 	0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x64, | ||||
| 	0x0a, 0x1f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, | ||||
| 	0x65, 0x12, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, | ||||
| 	0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, | ||||
| 	0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, | ||||
| 	0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, | ||||
| 	0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, | ||||
| 	0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, | ||||
| 	0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, | ||||
| 	0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, | ||||
| 	0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, | ||||
| 	0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, | ||||
| 	0x74, 0x65, 0x64, 0x22, 0x34, 0x0a, 0x1c, 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, | ||||
| 	0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, | ||||
| 	0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x89, 0x03, 0x0a, 0x10, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1c, | ||||
| 	0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, | ||||
| 	0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, | ||||
| 	0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, | ||||
| 	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, | ||||
| 	0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, | ||||
| 	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, | ||||
| 	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, | ||||
| 	0x66, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, | ||||
| 	0x66, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, | ||||
| 	0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, | ||||
| 	0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x08, | ||||
| 	0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, | ||||
| 	0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 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, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, | ||||
| 	0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, | ||||
| 	0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x73, | ||||
| 	0x74, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, | ||||
| 	0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, | ||||
| 	0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, | ||||
| 	0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x6e, | ||||
| 	0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x6e, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, | ||||
| 	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, | ||||
| 	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xa3, 0x0c, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||
| 	0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x22, | ||||
| 	0x2c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x10, 0x77, | ||||
| 	0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, | ||||
| 	0xe5, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, | ||||
| 	0x6e, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, | ||||
| 	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x22, 0x81, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7b, 0x1a, 0x67, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, 0x64, | ||||
| 	0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x65, 0x72, | ||||
| 	0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xc2, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, | ||||
| 	0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x60, 0x22, 0x4c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, 0x64, | ||||
| 	0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xd3, 0x01, 0x0a, | ||||
| 	0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x83, 0x01, 0x82, | ||||
| 	0xd3, 0xe4, 0x93, 0x02, 0x7d, 0x12, 0x32, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x5a, 0x47, 0x12, 0x45, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, | ||||
| 	0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, | ||||
| 	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, | ||||
| 	0x6e, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, | ||||
| 	0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, | ||||
| 	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, | ||||
| 	0x12, 0x3b, 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, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, | ||||
| 	0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, | ||||
| 	0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, | ||||
| 	0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, | ||||
| 	0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x1c, | ||||
| 	0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, | ||||
| 	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, | ||||
| 	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, | ||||
| 	0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, | ||||
| 	0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x23, 0x4c, 0x69, | ||||
| 	0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, | ||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, | ||||
| 	0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, | ||||
| 	0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, | ||||
| 	0x64, 0x22, 0x81, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, | ||||
| 	0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, | ||||
| 	0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, | ||||
| 	0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, | ||||
| 	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, | ||||
| 	0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, | ||||
| 	0x70, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0xc4, 0x01, 0x0a, | ||||
| 	0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, | ||||
| 	0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, | ||||
| 	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, | ||||
| 	0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, | ||||
| 	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, | ||||
| 	0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, | ||||
| 	0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, | ||||
| 	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, | ||||
| 	0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x1e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, | ||||
| 	0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x64, 0x0a, 0x1f, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, | ||||
| 	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x20, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, | ||||
| 	0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, | ||||
| 	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, | ||||
| 	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, | ||||
| 	0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, | ||||
| 	0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, | ||||
| 	0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, | ||||
| 	0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, | ||||
| 	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, | ||||
| 	0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, | ||||
| 	0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, | ||||
| 	0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, | ||||
| 	0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, 0x0a, 0x1c, 0x43, 0x72, | ||||
| 	0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, | ||||
| 	0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, | ||||
| 	0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, | ||||
| 	0x22, 0xd9, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, | ||||
| 	0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, | ||||
| 	0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, | ||||
| 	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, | ||||
| 	0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, | ||||
| 	0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, | ||||
| 	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, | ||||
| 	0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, | ||||
| 	0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, | ||||
| 	0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, | ||||
| 	0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, | ||||
| 	0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, | ||||
| 	0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, | ||||
| 	0x68, 0x69, 0x76, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, | ||||
| 	0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, | ||||
| 	0x73, 0x18, 0x0a, 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, 0x12, 0x3b, | ||||
| 	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, | ||||
| 	0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, | ||||
| 	0x70, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x63, | ||||
| 	0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, | ||||
| 	0x74, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x0a, | ||||
| 	0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, | ||||
| 	0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, | ||||
| 	0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6e, 0x0a, 0x20, | ||||
| 	0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 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, 0x12, | ||||
| 	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, | ||||
| 	0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xbb, 0x0a, 0x0a, | ||||
| 	0x17, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, | ||||
| 	0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x46, | ||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x22, 0x2c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x73, 0x12, 0xe9, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x21, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x95, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x8e, 0x01, 0x12, 0x3f, 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, 0x77, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, | ||||
| 	0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x7d, 0x5a, 0x4b, 0x12, 0x49, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, | ||||
| 	0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, | ||||
| 	0x12, 0xa8, 0x01, 0x0a, 0x17, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x1a, | ||||
| 	0x3a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, | ||||
| 	0x61, 0x74, 0x65, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xc2, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, | ||||
| 	0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, | ||||
| 	0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x22, 0x66, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x60, 0x22, 0x4c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, | ||||
| 	0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x69, 0x64, 0x7d, | ||||
| 	0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xd3, 0x01, 0x0a, 0x13, | ||||
| 	0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x83, 0x01, 0x82, 0xd3, | ||||
| 	0xe4, 0x93, 0x02, 0x7d, 0x12, 0x32, 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, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x5a, 0x47, 0x12, 0x45, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x76, | ||||
| 	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, | ||||
| 	0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, | ||||
| 	0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, | ||||
| 	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, | ||||
| 	0x3b, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, | ||||
| 	0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x33, | ||||
| 	0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, | ||||
| 	0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, | ||||
| 	0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, | ||||
| 	0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x73, 0x12, 0xe9, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x21, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x95, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x8e, | ||||
| 	0x01, 0x12, 0x3f, 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, 0x77, 0x6f, 0x72, | ||||
| 	0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, | ||||
| 	0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, | ||||
| 	0x65, 0x7d, 0x5a, 0x4b, 0x12, 0x49, 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, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x2f, 0x7b, | ||||
| 	0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, | ||||
| 	0xa8, 0x01, 0x0a, 0x17, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, | ||||
| 	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, | ||||
| 	0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, | ||||
| 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x1a, 0x3a, | ||||
| 	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, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, | ||||
| 	0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, | ||||
| 	0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, | ||||
| 	0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
| @@ -1214,6 +1231,7 @@ var file_workflow_template_proto_goTypes = []interface{}{ | ||||
| 	(*WorkflowTemplate)(nil),                     // 12: api.WorkflowTemplate | ||||
| 	(*GetWorkflowTemplateLabelsRequest)(nil),     // 13: api.GetWorkflowTemplateLabelsRequest | ||||
| 	(*KeyValue)(nil),                             // 14: api.KeyValue | ||||
| 	(*Parameter)(nil),                            // 15: api.Parameter | ||||
| } | ||||
| var file_workflow_template_proto_depIdxs = []int32{ | ||||
| 	12, // 0: api.CreateWorkflowTemplateRequest.workflowTemplate:type_name -> api.WorkflowTemplate | ||||
| @@ -1224,8 +1242,8 @@ var file_workflow_template_proto_depIdxs = []int32{ | ||||
| 	14, // 5: api.WorkflowTemplate.labels:type_name -> api.KeyValue | ||||
| 	10, // 6: api.WorkflowTemplate.stats:type_name -> api.WorkflowExecutionStatisticReport | ||||
| 	11, // 7: api.WorkflowTemplate.cronStats:type_name -> api.CronWorkflowStatisticsReport | ||||
| 	0,  // 8: api.WorkflowTemplateService.CreateWorkflowTemplate:input_type -> api.CreateWorkflowTemplateRequest | ||||
| 	1,  // 9: api.WorkflowTemplateService.UpdateWorkflowTemplateVersion:input_type -> api.UpdateWorkflowTemplateVersionRequest | ||||
| 	15, // 8: api.WorkflowTemplate.parameters:type_name -> api.Parameter | ||||
| 	0,  // 9: api.WorkflowTemplateService.CreateWorkflowTemplate:input_type -> api.CreateWorkflowTemplateRequest | ||||
| 	0,  // 10: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:input_type -> api.CreateWorkflowTemplateRequest | ||||
| 	2,  // 11: api.WorkflowTemplateService.GetWorkflowTemplate:input_type -> api.GetWorkflowTemplateRequest | ||||
| 	4,  // 12: api.WorkflowTemplateService.ListWorkflowTemplateVersions:input_type -> api.ListWorkflowTemplateVersionsRequest | ||||
| @@ -1233,18 +1251,17 @@ var file_workflow_template_proto_depIdxs = []int32{ | ||||
| 	3,  // 14: api.WorkflowTemplateService.CloneWorkflowTemplate:input_type -> api.CloneWorkflowTemplateRequest | ||||
| 	8,  // 15: api.WorkflowTemplateService.ArchiveWorkflowTemplate:input_type -> api.ArchiveWorkflowTemplateRequest | ||||
| 	12, // 16: api.WorkflowTemplateService.CreateWorkflowTemplate:output_type -> api.WorkflowTemplate | ||||
| 	12, // 17: api.WorkflowTemplateService.UpdateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate | ||||
| 	12, // 18: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate | ||||
| 	12, // 19: api.WorkflowTemplateService.GetWorkflowTemplate:output_type -> api.WorkflowTemplate | ||||
| 	5,  // 20: api.WorkflowTemplateService.ListWorkflowTemplateVersions:output_type -> api.ListWorkflowTemplateVersionsResponse | ||||
| 	7,  // 21: api.WorkflowTemplateService.ListWorkflowTemplates:output_type -> api.ListWorkflowTemplatesResponse | ||||
| 	12, // 22: api.WorkflowTemplateService.CloneWorkflowTemplate:output_type -> api.WorkflowTemplate | ||||
| 	9,  // 23: api.WorkflowTemplateService.ArchiveWorkflowTemplate:output_type -> api.ArchiveWorkflowTemplateResponse | ||||
| 	16, // [16:24] is the sub-list for method output_type | ||||
| 	8,  // [8:16] is the sub-list for method input_type | ||||
| 	8,  // [8:8] is the sub-list for extension type_name | ||||
| 	8,  // [8:8] is the sub-list for extension extendee | ||||
| 	0,  // [0:8] is the sub-list for field type_name | ||||
| 	12, // 17: api.WorkflowTemplateService.CreateWorkflowTemplateVersion:output_type -> api.WorkflowTemplate | ||||
| 	12, // 18: api.WorkflowTemplateService.GetWorkflowTemplate:output_type -> api.WorkflowTemplate | ||||
| 	5,  // 19: api.WorkflowTemplateService.ListWorkflowTemplateVersions:output_type -> api.ListWorkflowTemplateVersionsResponse | ||||
| 	7,  // 20: api.WorkflowTemplateService.ListWorkflowTemplates:output_type -> api.ListWorkflowTemplatesResponse | ||||
| 	12, // 21: api.WorkflowTemplateService.CloneWorkflowTemplate:output_type -> api.WorkflowTemplate | ||||
| 	9,  // 22: api.WorkflowTemplateService.ArchiveWorkflowTemplate:output_type -> api.ArchiveWorkflowTemplateResponse | ||||
| 	16, // [16:23] is the sub-list for method output_type | ||||
| 	9,  // [9:16] is the sub-list for method input_type | ||||
| 	9,  // [9:9] is the sub-list for extension type_name | ||||
| 	9,  // [9:9] is the sub-list for extension extendee | ||||
| 	0,  // [0:9] is the sub-list for field type_name | ||||
| } | ||||
|  | ||||
| func init() { file_workflow_template_proto_init() } | ||||
| @@ -1253,6 +1270,7 @@ func file_workflow_template_proto_init() { | ||||
| 		return | ||||
| 	} | ||||
| 	file_label_proto_init() | ||||
| 	file_common_proto_init() | ||||
| 	if !protoimpl.UnsafeEnabled { | ||||
| 		file_workflow_template_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*CreateWorkflowTemplateRequest); i { | ||||
| @@ -1456,7 +1474,6 @@ 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 WorkflowTemplateServiceClient interface { | ||||
| 	CreateWorkflowTemplate(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) | ||||
| 	UpdateWorkflowTemplateVersion(ctx context.Context, in *UpdateWorkflowTemplateVersionRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) | ||||
| 	CreateWorkflowTemplateVersion(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) | ||||
| 	GetWorkflowTemplate(ctx context.Context, in *GetWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) | ||||
| 	ListWorkflowTemplateVersions(ctx context.Context, in *ListWorkflowTemplateVersionsRequest, opts ...grpc.CallOption) (*ListWorkflowTemplateVersionsResponse, error) | ||||
| @@ -1482,15 +1499,6 @@ func (c *workflowTemplateServiceClient) CreateWorkflowTemplate(ctx context.Conte | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *workflowTemplateServiceClient) UpdateWorkflowTemplateVersion(ctx context.Context, in *UpdateWorkflowTemplateVersionRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) { | ||||
| 	out := new(WorkflowTemplate) | ||||
| 	err := c.cc.Invoke(ctx, "/api.WorkflowTemplateService/UpdateWorkflowTemplateVersion", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *workflowTemplateServiceClient) CreateWorkflowTemplateVersion(ctx context.Context, in *CreateWorkflowTemplateRequest, opts ...grpc.CallOption) (*WorkflowTemplate, error) { | ||||
| 	out := new(WorkflowTemplate) | ||||
| 	err := c.cc.Invoke(ctx, "/api.WorkflowTemplateService/CreateWorkflowTemplateVersion", in, out, opts...) | ||||
| @@ -1548,7 +1556,6 @@ func (c *workflowTemplateServiceClient) ArchiveWorkflowTemplate(ctx context.Cont | ||||
| // WorkflowTemplateServiceServer is the server API for WorkflowTemplateService service. | ||||
| type WorkflowTemplateServiceServer interface { | ||||
| 	CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) | ||||
| 	UpdateWorkflowTemplateVersion(context.Context, *UpdateWorkflowTemplateVersionRequest) (*WorkflowTemplate, error) | ||||
| 	CreateWorkflowTemplateVersion(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) | ||||
| 	GetWorkflowTemplate(context.Context, *GetWorkflowTemplateRequest) (*WorkflowTemplate, error) | ||||
| 	ListWorkflowTemplateVersions(context.Context, *ListWorkflowTemplateVersionsRequest) (*ListWorkflowTemplateVersionsResponse, error) | ||||
| @@ -1564,9 +1571,6 @@ type UnimplementedWorkflowTemplateServiceServer struct { | ||||
| func (*UnimplementedWorkflowTemplateServiceServer) CreateWorkflowTemplate(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method CreateWorkflowTemplate not implemented") | ||||
| } | ||||
| func (*UnimplementedWorkflowTemplateServiceServer) UpdateWorkflowTemplateVersion(context.Context, *UpdateWorkflowTemplateVersionRequest) (*WorkflowTemplate, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method UpdateWorkflowTemplateVersion not implemented") | ||||
| } | ||||
| func (*UnimplementedWorkflowTemplateServiceServer) CreateWorkflowTemplateVersion(context.Context, *CreateWorkflowTemplateRequest) (*WorkflowTemplate, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method CreateWorkflowTemplateVersion not implemented") | ||||
| } | ||||
| @@ -1608,24 +1612,6 @@ func _WorkflowTemplateService_CreateWorkflowTemplate_Handler(srv interface{}, ct | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _WorkflowTemplateService_UpdateWorkflowTemplateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(UpdateWorkflowTemplateVersionRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(WorkflowTemplateServiceServer).UpdateWorkflowTemplateVersion(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.WorkflowTemplateService/UpdateWorkflowTemplateVersion", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(WorkflowTemplateServiceServer).UpdateWorkflowTemplateVersion(ctx, req.(*UpdateWorkflowTemplateVersionRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _WorkflowTemplateService_CreateWorkflowTemplateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(CreateWorkflowTemplateRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| @@ -1742,10 +1728,6 @@ var _WorkflowTemplateService_serviceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "CreateWorkflowTemplate", | ||||
| 			Handler:    _WorkflowTemplateService_CreateWorkflowTemplate_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "UpdateWorkflowTemplateVersion", | ||||
| 			Handler:    _WorkflowTemplateService_UpdateWorkflowTemplateVersion_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "CreateWorkflowTemplateVersion", | ||||
| 			Handler:    _WorkflowTemplateService_CreateWorkflowTemplateVersion_Handler, | ||||
|   | ||||
| @@ -101,120 +101,6 @@ func local_request_WorkflowTemplateService_CreateWorkflowTemplate_0(ctx context. | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowTemplateServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq UpdateWorkflowTemplateVersionRequest | ||||
| 	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.WorkflowTemplate); 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["workflowTemplate.uid"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workflowTemplate.uid") | ||||
| 	} | ||||
|  | ||||
| 	err = runtime.PopulateFieldFromPath(&protoReq, "workflowTemplate.uid", val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workflowTemplate.uid", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["workflowTemplate.version"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workflowTemplate.version") | ||||
| 	} | ||||
|  | ||||
| 	err = runtime.PopulateFieldFromPath(&protoReq, "workflowTemplate.version", val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workflowTemplate.version", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.UpdateWorkflowTemplateVersion(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowTemplateServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq UpdateWorkflowTemplateVersionRequest | ||||
| 	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.WorkflowTemplate); 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["workflowTemplate.uid"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workflowTemplate.uid") | ||||
| 	} | ||||
|  | ||||
| 	err = runtime.PopulateFieldFromPath(&protoReq, "workflowTemplate.uid", val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workflowTemplate.uid", err) | ||||
| 	} | ||||
|  | ||||
| 	val, ok = pathParams["workflowTemplate.version"] | ||||
| 	if !ok { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "workflowTemplate.version") | ||||
| 	} | ||||
|  | ||||
| 	err = runtime.PopulateFieldFromPath(&protoReq, "workflowTemplate.version", val) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "workflowTemplate.version", err) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.UpdateWorkflowTemplateVersion(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkflowTemplateService_CreateWorkflowTemplateVersion_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowTemplateServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq CreateWorkflowTemplateRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| @@ -975,26 +861,6 @@ func RegisterWorkflowTemplateServiceHandlerServer(ctx context.Context, mux *runt | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("PUT", pattern_WorkflowTemplateService_UpdateWorkflowTemplateVersion_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_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_WorkflowTemplateService_CreateWorkflowTemplateVersion_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -1216,26 +1082,6 @@ func RegisterWorkflowTemplateServiceHandlerClient(ctx context.Context, mux *runt | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("PUT", pattern_WorkflowTemplateService_UpdateWorkflowTemplateVersion_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_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("POST", pattern_WorkflowTemplateService_CreateWorkflowTemplateVersion_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -1402,8 +1248,6 @@ func RegisterWorkflowTemplateServiceHandlerClient(ctx context.Context, mux *runt | ||||
| var ( | ||||
| 	pattern_WorkflowTemplateService_CreateWorkflowTemplate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workflow_templates"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowTemplateService_UpdateWorkflowTemplateVersion_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, 1, 0, 4, 1, 5, 6}, []string{"apis", "v1beta1", "namespace", "workflow_templates", "workflowTemplate.uid", "versions", "workflowTemplate.version"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowTemplateService_CreateWorkflowTemplateVersion_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_templates", "workflowTemplate.uid", "versions"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkflowTemplateService_GetWorkflowTemplate_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}, []string{"apis", "v1beta1", "namespace", "workflow_templates", "uid"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| @@ -1424,8 +1268,6 @@ var ( | ||||
| var ( | ||||
| 	forward_WorkflowTemplateService_CreateWorkflowTemplate_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowTemplateService_UpdateWorkflowTemplateVersion_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowTemplateService_CreateWorkflowTemplateVersion_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkflowTemplateService_GetWorkflowTemplate_0 = runtime.ForwardResponseMessage | ||||
|   | ||||
| @@ -4,6 +4,7 @@ package api; | ||||
|  | ||||
| import "google/api/annotations.proto"; | ||||
| import "label.proto"; | ||||
| import "common.proto"; | ||||
|  | ||||
| service WorkflowTemplateService { | ||||
|     rpc CreateWorkflowTemplate (CreateWorkflowTemplateRequest) returns (WorkflowTemplate) { | ||||
| @@ -13,13 +14,6 @@ service WorkflowTemplateService { | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc UpdateWorkflowTemplateVersion (UpdateWorkflowTemplateVersionRequest) returns (WorkflowTemplate) { | ||||
|         option (google.api.http) = { | ||||
|             put: "/apis/v1beta1/{namespace}/workflow_templates/{workflowTemplate.uid}/versions/{workflowTemplate.version}" | ||||
|             body: "workflowTemplate" | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     rpc CreateWorkflowTemplateVersion (CreateWorkflowTemplateRequest) returns (WorkflowTemplate) { | ||||
|         option (google.api.http) = { | ||||
|             post: "/apis/v1beta1/{namespace}/workflow_templates/{workflowTemplate.uid}/versions" | ||||
| @@ -101,6 +95,8 @@ message ListWorkflowTemplatesRequest { | ||||
|     string namespace = 1; | ||||
|     int32 pageSize = 2; | ||||
|     int32 page = 3; | ||||
|  | ||||
|     string labels = 4; | ||||
| } | ||||
|  | ||||
| message ListWorkflowTemplatesResponse { | ||||
| @@ -135,18 +131,19 @@ message CronWorkflowStatisticsReport { | ||||
|  | ||||
| message WorkflowTemplate { | ||||
|     string createdAt = 1; | ||||
|     string uid = 2; | ||||
|     string name = 3; | ||||
|     int64 version = 4; | ||||
|     int64 versions = 5; | ||||
|     string manifest = 6; | ||||
|     bool isLatest = 7; | ||||
|     bool isArchived = 8; | ||||
|     repeated KeyValue labels = 9; | ||||
|  | ||||
|     WorkflowExecutionStatisticReport stats = 10; | ||||
|     CronWorkflowStatisticsReport cronStats = 11; | ||||
|     string modifiedAt = 2; | ||||
|     string uid = 3; | ||||
|     string name = 4; | ||||
|     int64 version = 5; | ||||
|     int64 versions = 6; | ||||
|     string manifest = 7; | ||||
|     bool isLatest = 8; | ||||
|     bool isArchived = 9; | ||||
|     repeated KeyValue labels = 10; | ||||
|  | ||||
|     WorkflowExecutionStatisticReport stats = 11; | ||||
|     CronWorkflowStatisticsReport cronStats = 12; | ||||
|     repeated Parameter parameters = 13; | ||||
| } | ||||
|  | ||||
| message GetWorkflowTemplateLabelsRequest { | ||||
|   | ||||
| @@ -591,6 +591,9 @@ type ListWorkspaceRequest struct { | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	PageSize  int32  `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize,omitempty"` | ||||
| 	Page      int32  `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` | ||||
| 	Order     string `protobuf:"bytes,4,opt,name=order,proto3" json:"order,omitempty"` | ||||
| 	Labels    string `protobuf:"bytes,5,opt,name=labels,proto3" json:"labels,omitempty"` | ||||
| 	Phase     string `protobuf:"bytes,6,opt,name=phase,proto3" json:"phase,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceRequest) Reset() { | ||||
| @@ -646,6 +649,27 @@ func (x *ListWorkspaceRequest) GetPage() int32 { | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceRequest) GetOrder() string { | ||||
| 	if x != nil { | ||||
| 		return x.Order | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceRequest) GetLabels() string { | ||||
| 	if x != nil { | ||||
| 		return x.Labels | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceRequest) GetPhase() string { | ||||
| 	if x != nil { | ||||
| 		return x.Phase | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type ListWorkspaceResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -890,6 +914,314 @@ func (x *DeleteWorkspaceRequest) GetUid() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type RetryActionWorkspaceRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	Uid       string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *RetryActionWorkspaceRequest) Reset() { | ||||
| 	*x = RetryActionWorkspaceRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_workspace_proto_msgTypes[13] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *RetryActionWorkspaceRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*RetryActionWorkspaceRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *RetryActionWorkspaceRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_workspace_proto_msgTypes[13] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use RetryActionWorkspaceRequest.ProtoReflect.Descriptor instead. | ||||
| func (*RetryActionWorkspaceRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_workspace_proto_rawDescGZIP(), []int{13} | ||||
| } | ||||
|  | ||||
| func (x *RetryActionWorkspaceRequest) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *RetryActionWorkspaceRequest) GetUid() string { | ||||
| 	if x != nil { | ||||
| 		return x.Uid | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type WorkspaceStatisticReport struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Total             int32  `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` | ||||
| 	LastCreated       string `protobuf:"bytes,2,opt,name=lastCreated,proto3" json:"lastCreated,omitempty"` | ||||
| 	Launching         int32  `protobuf:"varint,3,opt,name=launching,proto3" json:"launching,omitempty"` | ||||
| 	Running           int32  `protobuf:"varint,4,opt,name=running,proto3" json:"running,omitempty"` | ||||
| 	Updating          int32  `protobuf:"varint,5,opt,name=updating,proto3" json:"updating,omitempty"` | ||||
| 	Pausing           int32  `protobuf:"varint,6,opt,name=pausing,proto3" json:"pausing,omitempty"` | ||||
| 	Paused            int32  `protobuf:"varint,7,opt,name=paused,proto3" json:"paused,omitempty"` | ||||
| 	Terminating       int32  `protobuf:"varint,8,opt,name=terminating,proto3" json:"terminating,omitempty"` | ||||
| 	Terminated        int32  `protobuf:"varint,9,opt,name=terminated,proto3" json:"terminated,omitempty"` | ||||
| 	FailedToPause     int32  `protobuf:"varint,10,opt,name=failedToPause,proto3" json:"failedToPause,omitempty"` | ||||
| 	FailedToResume    int32  `protobuf:"varint,11,opt,name=failedToResume,proto3" json:"failedToResume,omitempty"` | ||||
| 	FailedToTerminate int32  `protobuf:"varint,12,opt,name=failedToTerminate,proto3" json:"failedToTerminate,omitempty"` | ||||
| 	FailedToLaunch    int32  `protobuf:"varint,13,opt,name=failedToLaunch,proto3" json:"failedToLaunch,omitempty"` | ||||
| 	FailedToUpdate    int32  `protobuf:"varint,14,opt,name=failedToUpdate,proto3" json:"failedToUpdate,omitempty"` | ||||
| 	Failed            int32  `protobuf:"varint,15,opt,name=failed,proto3" json:"failed,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) Reset() { | ||||
| 	*x = WorkspaceStatisticReport{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_workspace_proto_msgTypes[14] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*WorkspaceStatisticReport) ProtoMessage() {} | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_workspace_proto_msgTypes[14] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use WorkspaceStatisticReport.ProtoReflect.Descriptor instead. | ||||
| func (*WorkspaceStatisticReport) Descriptor() ([]byte, []int) { | ||||
| 	return file_workspace_proto_rawDescGZIP(), []int{14} | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetTotal() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Total | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetLastCreated() string { | ||||
| 	if x != nil { | ||||
| 		return x.LastCreated | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetLaunching() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Launching | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetRunning() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Running | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetUpdating() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Updating | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetPausing() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Pausing | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetPaused() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Paused | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetTerminating() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Terminating | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetTerminated() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Terminated | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetFailedToPause() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.FailedToPause | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetFailedToResume() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.FailedToResume | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetFailedToTerminate() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.FailedToTerminate | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetFailedToLaunch() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.FailedToLaunch | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetFailedToUpdate() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.FailedToUpdate | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceStatisticReport) GetFailed() int32 { | ||||
| 	if x != nil { | ||||
| 		return x.Failed | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type GetWorkspaceStatisticsForNamespaceRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceRequest) Reset() { | ||||
| 	*x = GetWorkspaceStatisticsForNamespaceRequest{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_workspace_proto_msgTypes[15] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceRequest) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*GetWorkspaceStatisticsForNamespaceRequest) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceRequest) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_workspace_proto_msgTypes[15] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use GetWorkspaceStatisticsForNamespaceRequest.ProtoReflect.Descriptor instead. | ||||
| func (*GetWorkspaceStatisticsForNamespaceRequest) Descriptor() ([]byte, []int) { | ||||
| 	return file_workspace_proto_rawDescGZIP(), []int{15} | ||||
| } | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceRequest) GetNamespace() string { | ||||
| 	if x != nil { | ||||
| 		return x.Namespace | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type GetWorkspaceStatisticsForNamespaceResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| 	unknownFields protoimpl.UnknownFields | ||||
|  | ||||
| 	Stats *WorkspaceStatisticReport `protobuf:"bytes,1,opt,name=stats,proto3" json:"stats,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceResponse) Reset() { | ||||
| 	*x = GetWorkspaceStatisticsForNamespaceResponse{} | ||||
| 	if protoimpl.UnsafeEnabled { | ||||
| 		mi := &file_workspace_proto_msgTypes[16] | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		ms.StoreMessageInfo(mi) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceResponse) String() string { | ||||
| 	return protoimpl.X.MessageStringOf(x) | ||||
| } | ||||
|  | ||||
| func (*GetWorkspaceStatisticsForNamespaceResponse) ProtoMessage() {} | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceResponse) ProtoReflect() protoreflect.Message { | ||||
| 	mi := &file_workspace_proto_msgTypes[16] | ||||
| 	if protoimpl.UnsafeEnabled && x != nil { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| 			ms.StoreMessageInfo(mi) | ||||
| 		} | ||||
| 		return ms | ||||
| 	} | ||||
| 	return mi.MessageOf(x) | ||||
| } | ||||
|  | ||||
| // Deprecated: Use GetWorkspaceStatisticsForNamespaceResponse.ProtoReflect.Descriptor instead. | ||||
| func (*GetWorkspaceStatisticsForNamespaceResponse) Descriptor() ([]byte, []int) { | ||||
| 	return file_workspace_proto_rawDescGZIP(), []int{16} | ||||
| } | ||||
|  | ||||
| func (x *GetWorkspaceStatisticsForNamespaceResponse) GetStats() *WorkspaceStatisticReport { | ||||
| 	if x != nil { | ||||
| 		return x.Stats | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var File_workspace_proto protoreflect.FileDescriptor | ||||
|  | ||||
| var file_workspace_proto_rawDesc = []byte{ | ||||
| @@ -981,103 +1313,176 @@ var file_workspace_proto_rawDesc = []byte{ | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x62, 0x6f, 0x64, | ||||
| 	0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, | ||||
| 	0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x6f, 0x64, | ||||
| 	0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, | ||||
| 	0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, | ||||
| 	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, | ||||
| 	0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, | ||||
| 	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, | ||||
| 	0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, | ||||
| 	0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, | ||||
| 	0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, | ||||
| 	0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, | ||||
| 	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, | ||||
| 	0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x47, 0x0a, 0x15, 0x50, 0x61, 0x75, 0x73, 0x65, | ||||
| 	0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xa8, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x10, | ||||
| 	0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, | ||||
| 	0x22, 0x48, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, | ||||
| 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x48, 0x0a, 0x16, 0x44, 0x65, | ||||
| 	0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, | ||||
| 	0x03, 0x75, 0x69, 0x64, 0x32, 0x86, 0x08, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x43, 0x72, 0x65, | ||||
| 	0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x2c, 0x22, 0x24, 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, 0x77, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x6c, 0x0a, | ||||
| 	0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, | ||||
| 	0x2a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x7b, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, | ||||
| 	0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, | ||||
| 	0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, | ||||
| 	0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, | ||||
| 	0x72, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, | ||||
| 	0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, | ||||
| 	0x73, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, | ||||
| 	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, | ||||
| 	0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, | ||||
| 	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, | ||||
| 	0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, | ||||
| 	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x47, 0x0a, 0x15, | ||||
| 	0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, | ||||
| 	0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x48, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x10, 0x0a, | ||||
| 	0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, | ||||
| 	0x48, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, | ||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, | ||||
| 	0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xfe, 0x03, 0x0a, 0x18, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, | ||||
| 	0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, | ||||
| 	0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x6c, | ||||
| 	0x61, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, | ||||
| 	0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, | ||||
| 	0x09, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x09, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x72, | ||||
| 	0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, | ||||
| 	0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x70, 0x64, 0x61, 0x74, 0x69, 0x6e, | ||||
| 	0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x75, 0x70, 0x64, 0x61, 0x74, 0x69, 0x6e, | ||||
| 	0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, | ||||
| 	0x28, 0x05, 0x52, 0x07, 0x70, 0x61, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, | ||||
| 	0x61, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x61, 0x75, | ||||
| 	0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, | ||||
| 	0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, | ||||
| 	0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, | ||||
| 	0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, | ||||
| 	0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, | ||||
| 	0x6f, 0x50, 0x61, 0x75, 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x66, 0x61, | ||||
| 	0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x50, 0x61, 0x75, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x66, | ||||
| 	0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x18, 0x0b, 0x20, | ||||
| 	0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x52, 0x65, 0x73, | ||||
| 	0x75, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x54, | ||||
| 	0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, | ||||
| 	0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, | ||||
| 	0x65, 0x12, 0x26, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x4c, 0x61, 0x75, | ||||
| 	0x6e, 0x63, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, | ||||
| 	0x64, 0x54, 0x6f, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x66, 0x61, 0x69, | ||||
| 	0x6c, 0x65, 0x64, 0x54, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, | ||||
| 	0x05, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, | ||||
| 	0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, | ||||
| 	0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x49, 0x0a, 0x29, 0x47, 0x65, 0x74, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, | ||||
| 	0x69, 0x63, 0x73, 0x46, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x22, 0x61, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x46, 0x6f, | ||||
| 	0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, | ||||
| 	0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, | ||||
| 	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x32, 0xd7, 0x0a, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x0f, | ||||
| 	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, | ||||
| 	0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, | ||||
| 	0xe4, 0x93, 0x02, 0x2c, 0x22, 0x24, 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, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, | ||||
| 	0x12, 0xbd, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x46, 0x6f, 0x72, 0x4e, 0x61, | ||||
| 	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, | ||||
| 	0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, | ||||
| 	0x74, 0x69, 0x63, 0x73, 0x46, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, | ||||
| 	0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, | ||||
| 	0x74, 0x69, 0x63, 0x73, 0x46, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, | ||||
| 	0x12, 0x2e, 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, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, | ||||
| 	0x12, 0x6c, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, | ||||
| 	0x02, 0x2c, 0x12, 0x2a, 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, 0x77, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x75, | ||||
| 	0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, | ||||
| 	0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, | ||||
| 	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, | ||||
| 	0x24, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, 0x0e, 0x4c, | ||||
| 	0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x19, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, | ||||
| 	0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, | ||||
| 	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||
| 	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, | ||||
| 	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, | ||||
| 	0x75, 0x73, 0x3a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x0f, 0x55, | ||||
| 	0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, | ||||
| 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, | ||||
| 	0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x2a, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x7e, 0x0a, | ||||
| 	0x0e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, | ||||
| 	0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, | ||||
| 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, | ||||
| 	0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x30, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0x81, 0x01, | ||||
| 	0x0a, 0x0f, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, | ||||
| 	0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, | ||||
| 	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, | ||||
| 	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 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, 0x77, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x73, | ||||
| 	0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x80, 0x01, | ||||
| 	0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, | ||||
| 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | ||||
| 	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x31, | ||||
| 	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x2a, | ||||
| 	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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6d, | ||||
| 	0x65, 0x12, 0x7a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, | ||||
| 	0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, | ||||
| 	0x12, 0x7e, 0x0a, 0x0e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, | ||||
| 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | ||||
| 	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, 0x30, | ||||
| 	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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, | ||||
| 	0x12, 0x81, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6d, | ||||
| 	0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x2c, 0x2a, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, | ||||
| 	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x33, 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, 0x77, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x62, 0x06, 0x70, | ||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, | ||||
| 	0x73, 0x75, 0x6d, 0x65, 0x12, 0x7a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, | ||||
| 	0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, | ||||
| 	0xe4, 0x93, 0x02, 0x2c, 0x2a, 0x2a, 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, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, | ||||
| 	0x12, 0x8e, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4c, 0x61, 0x73, 0x74, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, | ||||
| 	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, | ||||
| 	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x1a, | ||||
| 	0x30, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x74, 0x72, | ||||
| 	0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
| @@ -1092,61 +1497,70 @@ func file_workspace_proto_rawDescGZIP() []byte { | ||||
| 	return file_workspace_proto_rawDescData | ||||
| } | ||||
|  | ||||
| var file_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 13) | ||||
| var file_workspace_proto_msgTypes = make([]protoimpl.MessageInfo, 17) | ||||
| var file_workspace_proto_goTypes = []interface{}{ | ||||
| 	(*Workspace)(nil),                    // 0: api.Workspace | ||||
| 	(*WorkspaceStatus)(nil),              // 1: api.WorkspaceStatus | ||||
| 	(*CreateWorkspaceBody)(nil),          // 2: api.CreateWorkspaceBody | ||||
| 	(*CreateWorkspaceRequest)(nil),       // 3: api.CreateWorkspaceRequest | ||||
| 	(*GetWorkspaceRequest)(nil),          // 4: api.GetWorkspaceRequest | ||||
| 	(*UpdateWorkspaceStatusRequest)(nil), // 5: api.UpdateWorkspaceStatusRequest | ||||
| 	(*UpdateWorkspaceBody)(nil),          // 6: api.UpdateWorkspaceBody | ||||
| 	(*UpdateWorkspaceRequest)(nil),       // 7: api.UpdateWorkspaceRequest | ||||
| 	(*ListWorkspaceRequest)(nil),         // 8: api.ListWorkspaceRequest | ||||
| 	(*ListWorkspaceResponse)(nil),        // 9: api.ListWorkspaceResponse | ||||
| 	(*PauseWorkspaceRequest)(nil),        // 10: api.PauseWorkspaceRequest | ||||
| 	(*ResumeWorkspaceRequest)(nil),       // 11: api.ResumeWorkspaceRequest | ||||
| 	(*DeleteWorkspaceRequest)(nil),       // 12: api.DeleteWorkspaceRequest | ||||
| 	(*Parameter)(nil),                    // 13: api.Parameter | ||||
| 	(*WorkspaceTemplate)(nil),            // 14: api.WorkspaceTemplate | ||||
| 	(*KeyValue)(nil),                     // 15: api.KeyValue | ||||
| 	(*empty.Empty)(nil),                  // 16: google.protobuf.Empty | ||||
| 	(*Workspace)(nil),                                  // 0: api.Workspace | ||||
| 	(*WorkspaceStatus)(nil),                            // 1: api.WorkspaceStatus | ||||
| 	(*CreateWorkspaceBody)(nil),                        // 2: api.CreateWorkspaceBody | ||||
| 	(*CreateWorkspaceRequest)(nil),                     // 3: api.CreateWorkspaceRequest | ||||
| 	(*GetWorkspaceRequest)(nil),                        // 4: api.GetWorkspaceRequest | ||||
| 	(*UpdateWorkspaceStatusRequest)(nil),               // 5: api.UpdateWorkspaceStatusRequest | ||||
| 	(*UpdateWorkspaceBody)(nil),                        // 6: api.UpdateWorkspaceBody | ||||
| 	(*UpdateWorkspaceRequest)(nil),                     // 7: api.UpdateWorkspaceRequest | ||||
| 	(*ListWorkspaceRequest)(nil),                       // 8: api.ListWorkspaceRequest | ||||
| 	(*ListWorkspaceResponse)(nil),                      // 9: api.ListWorkspaceResponse | ||||
| 	(*PauseWorkspaceRequest)(nil),                      // 10: api.PauseWorkspaceRequest | ||||
| 	(*ResumeWorkspaceRequest)(nil),                     // 11: api.ResumeWorkspaceRequest | ||||
| 	(*DeleteWorkspaceRequest)(nil),                     // 12: api.DeleteWorkspaceRequest | ||||
| 	(*RetryActionWorkspaceRequest)(nil),                // 13: api.RetryActionWorkspaceRequest | ||||
| 	(*WorkspaceStatisticReport)(nil),                   // 14: api.WorkspaceStatisticReport | ||||
| 	(*GetWorkspaceStatisticsForNamespaceRequest)(nil),  // 15: api.GetWorkspaceStatisticsForNamespaceRequest | ||||
| 	(*GetWorkspaceStatisticsForNamespaceResponse)(nil), // 16: api.GetWorkspaceStatisticsForNamespaceResponse | ||||
| 	(*Parameter)(nil),                                  // 17: api.Parameter | ||||
| 	(*WorkspaceTemplate)(nil),                          // 18: api.WorkspaceTemplate | ||||
| 	(*KeyValue)(nil),                                   // 19: api.KeyValue | ||||
| 	(*empty.Empty)(nil),                                // 20: google.protobuf.Empty | ||||
| } | ||||
| var file_workspace_proto_depIdxs = []int32{ | ||||
| 	13, // 0: api.Workspace.parameters:type_name -> api.Parameter | ||||
| 	14, // 1: api.Workspace.workspaceTemplate:type_name -> api.WorkspaceTemplate | ||||
| 	17, // 0: api.Workspace.parameters:type_name -> api.Parameter | ||||
| 	18, // 1: api.Workspace.workspaceTemplate:type_name -> api.WorkspaceTemplate | ||||
| 	1,  // 2: api.Workspace.status:type_name -> api.WorkspaceStatus | ||||
| 	15, // 3: api.Workspace.labels:type_name -> api.KeyValue | ||||
| 	13, // 4: api.Workspace.templateParameters:type_name -> api.Parameter | ||||
| 	13, // 5: api.CreateWorkspaceBody.parameters:type_name -> api.Parameter | ||||
| 	15, // 6: api.CreateWorkspaceBody.labels:type_name -> api.KeyValue | ||||
| 	19, // 3: api.Workspace.labels:type_name -> api.KeyValue | ||||
| 	17, // 4: api.Workspace.templateParameters:type_name -> api.Parameter | ||||
| 	17, // 5: api.CreateWorkspaceBody.parameters:type_name -> api.Parameter | ||||
| 	19, // 6: api.CreateWorkspaceBody.labels:type_name -> api.KeyValue | ||||
| 	2,  // 7: api.CreateWorkspaceRequest.body:type_name -> api.CreateWorkspaceBody | ||||
| 	1,  // 8: api.UpdateWorkspaceStatusRequest.status:type_name -> api.WorkspaceStatus | ||||
| 	13, // 9: api.UpdateWorkspaceBody.parameters:type_name -> api.Parameter | ||||
| 	15, // 10: api.UpdateWorkspaceBody.labels:type_name -> api.KeyValue | ||||
| 	17, // 9: api.UpdateWorkspaceBody.parameters:type_name -> api.Parameter | ||||
| 	19, // 10: api.UpdateWorkspaceBody.labels:type_name -> api.KeyValue | ||||
| 	6,  // 11: api.UpdateWorkspaceRequest.body:type_name -> api.UpdateWorkspaceBody | ||||
| 	0,  // 12: api.ListWorkspaceResponse.workspaces:type_name -> api.Workspace | ||||
| 	3,  // 13: api.WorkspaceService.CreateWorkspace:input_type -> api.CreateWorkspaceRequest | ||||
| 	4,  // 14: api.WorkspaceService.GetWorkspace:input_type -> api.GetWorkspaceRequest | ||||
| 	8,  // 15: api.WorkspaceService.ListWorkspaces:input_type -> api.ListWorkspaceRequest | ||||
| 	5,  // 16: api.WorkspaceService.UpdateWorkspaceStatus:input_type -> api.UpdateWorkspaceStatusRequest | ||||
| 	7,  // 17: api.WorkspaceService.UpdateWorkspace:input_type -> api.UpdateWorkspaceRequest | ||||
| 	10, // 18: api.WorkspaceService.PauseWorkspace:input_type -> api.PauseWorkspaceRequest | ||||
| 	11, // 19: api.WorkspaceService.ResumeWorkspace:input_type -> api.ResumeWorkspaceRequest | ||||
| 	12, // 20: api.WorkspaceService.DeleteWorkspace:input_type -> api.DeleteWorkspaceRequest | ||||
| 	0,  // 21: api.WorkspaceService.CreateWorkspace:output_type -> api.Workspace | ||||
| 	0,  // 22: api.WorkspaceService.GetWorkspace:output_type -> api.Workspace | ||||
| 	9,  // 23: api.WorkspaceService.ListWorkspaces:output_type -> api.ListWorkspaceResponse | ||||
| 	16, // 24: api.WorkspaceService.UpdateWorkspaceStatus:output_type -> google.protobuf.Empty | ||||
| 	16, // 25: api.WorkspaceService.UpdateWorkspace:output_type -> google.protobuf.Empty | ||||
| 	16, // 26: api.WorkspaceService.PauseWorkspace:output_type -> google.protobuf.Empty | ||||
| 	16, // 27: api.WorkspaceService.ResumeWorkspace:output_type -> google.protobuf.Empty | ||||
| 	16, // 28: api.WorkspaceService.DeleteWorkspace:output_type -> google.protobuf.Empty | ||||
| 	21, // [21:29] is the sub-list for method output_type | ||||
| 	13, // [13:21] is the sub-list for method input_type | ||||
| 	13, // [13:13] is the sub-list for extension type_name | ||||
| 	13, // [13:13] is the sub-list for extension extendee | ||||
| 	0,  // [0:13] is the sub-list for field type_name | ||||
| 	14, // 13: api.GetWorkspaceStatisticsForNamespaceResponse.stats:type_name -> api.WorkspaceStatisticReport | ||||
| 	3,  // 14: api.WorkspaceService.CreateWorkspace:input_type -> api.CreateWorkspaceRequest | ||||
| 	15, // 15: api.WorkspaceService.GetWorkspaceStatisticsForNamespace:input_type -> api.GetWorkspaceStatisticsForNamespaceRequest | ||||
| 	4,  // 16: api.WorkspaceService.GetWorkspace:input_type -> api.GetWorkspaceRequest | ||||
| 	8,  // 17: api.WorkspaceService.ListWorkspaces:input_type -> api.ListWorkspaceRequest | ||||
| 	5,  // 18: api.WorkspaceService.UpdateWorkspaceStatus:input_type -> api.UpdateWorkspaceStatusRequest | ||||
| 	7,  // 19: api.WorkspaceService.UpdateWorkspace:input_type -> api.UpdateWorkspaceRequest | ||||
| 	10, // 20: api.WorkspaceService.PauseWorkspace:input_type -> api.PauseWorkspaceRequest | ||||
| 	11, // 21: api.WorkspaceService.ResumeWorkspace:input_type -> api.ResumeWorkspaceRequest | ||||
| 	12, // 22: api.WorkspaceService.DeleteWorkspace:input_type -> api.DeleteWorkspaceRequest | ||||
| 	13, // 23: api.WorkspaceService.RetryLastWorkspaceAction:input_type -> api.RetryActionWorkspaceRequest | ||||
| 	0,  // 24: api.WorkspaceService.CreateWorkspace:output_type -> api.Workspace | ||||
| 	16, // 25: api.WorkspaceService.GetWorkspaceStatisticsForNamespace:output_type -> api.GetWorkspaceStatisticsForNamespaceResponse | ||||
| 	0,  // 26: api.WorkspaceService.GetWorkspace:output_type -> api.Workspace | ||||
| 	9,  // 27: api.WorkspaceService.ListWorkspaces:output_type -> api.ListWorkspaceResponse | ||||
| 	20, // 28: api.WorkspaceService.UpdateWorkspaceStatus:output_type -> google.protobuf.Empty | ||||
| 	20, // 29: api.WorkspaceService.UpdateWorkspace:output_type -> google.protobuf.Empty | ||||
| 	20, // 30: api.WorkspaceService.PauseWorkspace:output_type -> google.protobuf.Empty | ||||
| 	20, // 31: api.WorkspaceService.ResumeWorkspace:output_type -> google.protobuf.Empty | ||||
| 	20, // 32: api.WorkspaceService.DeleteWorkspace:output_type -> google.protobuf.Empty | ||||
| 	20, // 33: api.WorkspaceService.RetryLastWorkspaceAction:output_type -> google.protobuf.Empty | ||||
| 	24, // [24:34] is the sub-list for method output_type | ||||
| 	14, // [14:24] is the sub-list for method input_type | ||||
| 	14, // [14:14] is the sub-list for extension type_name | ||||
| 	14, // [14:14] is the sub-list for extension extendee | ||||
| 	0,  // [0:14] is the sub-list for field type_name | ||||
| } | ||||
|  | ||||
| func init() { file_workspace_proto_init() } | ||||
| @@ -1314,6 +1728,54 @@ func file_workspace_proto_init() { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_workspace_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*RetryActionWorkspaceRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_workspace_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*WorkspaceStatisticReport); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_workspace_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetWorkspaceStatisticsForNamespaceRequest); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			case 1: | ||||
| 				return &v.sizeCache | ||||
| 			case 2: | ||||
| 				return &v.unknownFields | ||||
| 			default: | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		file_workspace_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { | ||||
| 			switch v := v.(*GetWorkspaceStatisticsForNamespaceResponse); 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{ | ||||
| @@ -1321,7 +1783,7 @@ func file_workspace_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_workspace_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   13, | ||||
| 			NumMessages:   17, | ||||
| 			NumExtensions: 0, | ||||
| 			NumServices:   1, | ||||
| 		}, | ||||
| @@ -1348,6 +1810,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 WorkspaceServiceClient interface { | ||||
| 	CreateWorkspace(ctx context.Context, in *CreateWorkspaceRequest, opts ...grpc.CallOption) (*Workspace, error) | ||||
| 	GetWorkspaceStatisticsForNamespace(ctx context.Context, in *GetWorkspaceStatisticsForNamespaceRequest, opts ...grpc.CallOption) (*GetWorkspaceStatisticsForNamespaceResponse, error) | ||||
| 	GetWorkspace(ctx context.Context, in *GetWorkspaceRequest, opts ...grpc.CallOption) (*Workspace, error) | ||||
| 	ListWorkspaces(ctx context.Context, in *ListWorkspaceRequest, opts ...grpc.CallOption) (*ListWorkspaceResponse, error) | ||||
| 	UpdateWorkspaceStatus(ctx context.Context, in *UpdateWorkspaceStatusRequest, opts ...grpc.CallOption) (*empty.Empty, error) | ||||
| @@ -1355,6 +1818,7 @@ type WorkspaceServiceClient interface { | ||||
| 	PauseWorkspace(ctx context.Context, in *PauseWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) | ||||
| 	ResumeWorkspace(ctx context.Context, in *ResumeWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) | ||||
| 	DeleteWorkspace(ctx context.Context, in *DeleteWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) | ||||
| 	RetryLastWorkspaceAction(ctx context.Context, in *RetryActionWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) | ||||
| } | ||||
|  | ||||
| type workspaceServiceClient struct { | ||||
| @@ -1374,6 +1838,15 @@ func (c *workspaceServiceClient) CreateWorkspace(ctx context.Context, in *Create | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *workspaceServiceClient) GetWorkspaceStatisticsForNamespace(ctx context.Context, in *GetWorkspaceStatisticsForNamespaceRequest, opts ...grpc.CallOption) (*GetWorkspaceStatisticsForNamespaceResponse, error) { | ||||
| 	out := new(GetWorkspaceStatisticsForNamespaceResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/api.WorkspaceService/GetWorkspaceStatisticsForNamespace", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *workspaceServiceClient) GetWorkspace(ctx context.Context, in *GetWorkspaceRequest, opts ...grpc.CallOption) (*Workspace, error) { | ||||
| 	out := new(Workspace) | ||||
| 	err := c.cc.Invoke(ctx, "/api.WorkspaceService/GetWorkspace", in, out, opts...) | ||||
| @@ -1437,9 +1910,19 @@ func (c *workspaceServiceClient) DeleteWorkspace(ctx context.Context, in *Delete | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *workspaceServiceClient) RetryLastWorkspaceAction(ctx context.Context, in *RetryActionWorkspaceRequest, opts ...grpc.CallOption) (*empty.Empty, error) { | ||||
| 	out := new(empty.Empty) | ||||
| 	err := c.cc.Invoke(ctx, "/api.WorkspaceService/RetryLastWorkspaceAction", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| // WorkspaceServiceServer is the server API for WorkspaceService service. | ||||
| type WorkspaceServiceServer interface { | ||||
| 	CreateWorkspace(context.Context, *CreateWorkspaceRequest) (*Workspace, error) | ||||
| 	GetWorkspaceStatisticsForNamespace(context.Context, *GetWorkspaceStatisticsForNamespaceRequest) (*GetWorkspaceStatisticsForNamespaceResponse, error) | ||||
| 	GetWorkspace(context.Context, *GetWorkspaceRequest) (*Workspace, error) | ||||
| 	ListWorkspaces(context.Context, *ListWorkspaceRequest) (*ListWorkspaceResponse, error) | ||||
| 	UpdateWorkspaceStatus(context.Context, *UpdateWorkspaceStatusRequest) (*empty.Empty, error) | ||||
| @@ -1447,6 +1930,7 @@ type WorkspaceServiceServer interface { | ||||
| 	PauseWorkspace(context.Context, *PauseWorkspaceRequest) (*empty.Empty, error) | ||||
| 	ResumeWorkspace(context.Context, *ResumeWorkspaceRequest) (*empty.Empty, error) | ||||
| 	DeleteWorkspace(context.Context, *DeleteWorkspaceRequest) (*empty.Empty, error) | ||||
| 	RetryLastWorkspaceAction(context.Context, *RetryActionWorkspaceRequest) (*empty.Empty, error) | ||||
| } | ||||
|  | ||||
| // UnimplementedWorkspaceServiceServer can be embedded to have forward compatible implementations. | ||||
| @@ -1456,6 +1940,9 @@ type UnimplementedWorkspaceServiceServer struct { | ||||
| func (*UnimplementedWorkspaceServiceServer) CreateWorkspace(context.Context, *CreateWorkspaceRequest) (*Workspace, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method CreateWorkspace not implemented") | ||||
| } | ||||
| func (*UnimplementedWorkspaceServiceServer) GetWorkspaceStatisticsForNamespace(context.Context, *GetWorkspaceStatisticsForNamespaceRequest) (*GetWorkspaceStatisticsForNamespaceResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetWorkspaceStatisticsForNamespace not implemented") | ||||
| } | ||||
| func (*UnimplementedWorkspaceServiceServer) GetWorkspace(context.Context, *GetWorkspaceRequest) (*Workspace, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetWorkspace not implemented") | ||||
| } | ||||
| @@ -1477,6 +1964,9 @@ func (*UnimplementedWorkspaceServiceServer) ResumeWorkspace(context.Context, *Re | ||||
| func (*UnimplementedWorkspaceServiceServer) DeleteWorkspace(context.Context, *DeleteWorkspaceRequest) (*empty.Empty, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method DeleteWorkspace not implemented") | ||||
| } | ||||
| func (*UnimplementedWorkspaceServiceServer) RetryLastWorkspaceAction(context.Context, *RetryActionWorkspaceRequest) (*empty.Empty, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method RetryLastWorkspaceAction not implemented") | ||||
| } | ||||
|  | ||||
| func RegisterWorkspaceServiceServer(s *grpc.Server, srv WorkspaceServiceServer) { | ||||
| 	s.RegisterService(&_WorkspaceService_serviceDesc, srv) | ||||
| @@ -1500,6 +1990,24 @@ func _WorkspaceService_CreateWorkspace_Handler(srv interface{}, ctx context.Cont | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _WorkspaceService_GetWorkspaceStatisticsForNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetWorkspaceStatisticsForNamespaceRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(WorkspaceServiceServer).GetWorkspaceStatisticsForNamespace(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.WorkspaceService/GetWorkspaceStatisticsForNamespace", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(WorkspaceServiceServer).GetWorkspaceStatisticsForNamespace(ctx, req.(*GetWorkspaceStatisticsForNamespaceRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _WorkspaceService_GetWorkspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetWorkspaceRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| @@ -1626,6 +2134,24 @@ func _WorkspaceService_DeleteWorkspace_Handler(srv interface{}, ctx context.Cont | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _WorkspaceService_RetryLastWorkspaceAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(RetryActionWorkspaceRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(WorkspaceServiceServer).RetryLastWorkspaceAction(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/api.WorkspaceService/RetryLastWorkspaceAction", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(WorkspaceServiceServer).RetryLastWorkspaceAction(ctx, req.(*RetryActionWorkspaceRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| var _WorkspaceService_serviceDesc = grpc.ServiceDesc{ | ||||
| 	ServiceName: "api.WorkspaceService", | ||||
| 	HandlerType: (*WorkspaceServiceServer)(nil), | ||||
| @@ -1634,6 +2160,10 @@ var _WorkspaceService_serviceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "CreateWorkspace", | ||||
| 			Handler:    _WorkspaceService_CreateWorkspace_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetWorkspaceStatisticsForNamespace", | ||||
| 			Handler:    _WorkspaceService_GetWorkspaceStatisticsForNamespace_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetWorkspace", | ||||
| 			Handler:    _WorkspaceService_GetWorkspace_Handler, | ||||
| @@ -1662,6 +2192,10 @@ var _WorkspaceService_serviceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "DeleteWorkspace", | ||||
| 			Handler:    _WorkspaceService_DeleteWorkspace_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "RetryLastWorkspaceAction", | ||||
| 			Handler:    _WorkspaceService_RetryLastWorkspaceAction_Handler, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Streams:  []grpc.StreamDesc{}, | ||||
| 	Metadata: "workspace.proto", | ||||
|   | ||||
| @@ -101,6 +101,60 @@ func local_request_WorkspaceService_CreateWorkspace_0(ctx context.Context, marsh | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkspaceService_GetWorkspaceStatisticsForNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetWorkspaceStatisticsForNamespaceRequest | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := client.GetWorkspaceStatisticsForNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_WorkspaceService_GetWorkspaceStatisticsForNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetWorkspaceStatisticsForNamespaceRequest | ||||
| 	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) | ||||
| 	} | ||||
|  | ||||
| 	msg, err := server.GetWorkspaceStatisticsForNamespace(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkspaceService_GetWorkspace_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetWorkspaceRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| @@ -658,6 +712,82 @@ func local_request_WorkspaceService_DeleteWorkspace_0(ctx context.Context, marsh | ||||
|  | ||||
| } | ||||
|  | ||||
| func request_WorkspaceService_RetryLastWorkspaceAction_0(ctx context.Context, marshaler runtime.Marshaler, client WorkspaceServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq RetryActionWorkspaceRequest | ||||
| 	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["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.RetryLastWorkspaceAction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| func local_request_WorkspaceService_RetryLastWorkspaceAction_0(ctx context.Context, marshaler runtime.Marshaler, server WorkspaceServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq RetryActionWorkspaceRequest | ||||
| 	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["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.RetryLastWorkspaceAction(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
|  | ||||
| } | ||||
|  | ||||
| // RegisterWorkspaceServiceHandlerServer registers the http handlers for service WorkspaceService to "mux". | ||||
| // UnaryRPC     :call WorkspaceServiceServer directly. | ||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. | ||||
| @@ -683,6 +813,26 @@ func RegisterWorkspaceServiceHandlerServer(ctx context.Context, mux *runtime.Ser | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkspaceService_GetWorkspaceStatisticsForNamespace_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_WorkspaceService_GetWorkspaceStatisticsForNamespace_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkspaceService_GetWorkspaceStatisticsForNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkspaceService_GetWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -823,6 +973,26 @@ func RegisterWorkspaceServiceHandlerServer(ctx context.Context, mux *runtime.Ser | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("PUT", pattern_WorkspaceService_RetryLastWorkspaceAction_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_WorkspaceService_RetryLastWorkspaceAction_0(rctx, inboundMarshaler, server, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkspaceService_RetryLastWorkspaceAction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -884,6 +1054,26 @@ func RegisterWorkspaceServiceHandlerClient(ctx context.Context, mux *runtime.Ser | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkspaceService_GetWorkspaceStatisticsForNamespace_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_WorkspaceService_GetWorkspaceStatisticsForNamespace_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkspaceService_GetWorkspaceStatisticsForNamespace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("GET", pattern_WorkspaceService_GetWorkspace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| @@ -1024,12 +1214,34 @@ func RegisterWorkspaceServiceHandlerClient(ctx context.Context, mux *runtime.Ser | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	mux.Handle("PUT", pattern_WorkspaceService_RetryLastWorkspaceAction_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_WorkspaceService_RetryLastWorkspaceAction_0(rctx, inboundMarshaler, client, req, pathParams) | ||||
| 		ctx = runtime.NewServerMetadataContext(ctx, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		forward_WorkspaceService_RetryLastWorkspaceAction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
|  | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	pattern_WorkspaceService_CreateWorkspace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workspaces"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkspaceService_GetWorkspaceStatisticsForNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"apis", "v1beta1", "namespace", "workspace", "statistics"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkspaceService_GetWorkspace_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}, []string{"apis", "v1beta1", "namespace", "workspaces", "uid"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkspaceService_ListWorkspaces_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"apis", "v1beta1", "namespace", "workspaces"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| @@ -1043,11 +1255,15 @@ var ( | ||||
| 	pattern_WorkspaceService_ResumeWorkspace_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", "workspaces", "uid", "resume"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkspaceService_DeleteWorkspace_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}, []string{"apis", "v1beta1", "namespace", "workspaces", "uid"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
|  | ||||
| 	pattern_WorkspaceService_RetryLastWorkspaceAction_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", "workspaces", "uid", "retry"}, "", runtime.AssumeColonVerbOpt(true))) | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	forward_WorkspaceService_CreateWorkspace_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkspaceService_GetWorkspaceStatisticsForNamespace_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkspaceService_GetWorkspace_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkspaceService_ListWorkspaces_0 = runtime.ForwardResponseMessage | ||||
| @@ -1061,4 +1277,6 @@ var ( | ||||
| 	forward_WorkspaceService_ResumeWorkspace_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkspaceService_DeleteWorkspace_0 = runtime.ForwardResponseMessage | ||||
|  | ||||
| 	forward_WorkspaceService_RetryLastWorkspaceAction_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
|   | ||||
| @@ -16,6 +16,12 @@ service WorkspaceService { | ||||
|         }; | ||||
| 	} | ||||
|  | ||||
| 	rpc GetWorkspaceStatisticsForNamespace (GetWorkspaceStatisticsForNamespaceRequest) returns (GetWorkspaceStatisticsForNamespaceResponse) { | ||||
| 		option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/workspace/statistics" | ||||
|         }; | ||||
| 	} | ||||
|  | ||||
| 	rpc GetWorkspace (GetWorkspaceRequest) returns (Workspace) { | ||||
| 		option (google.api.http) = { | ||||
|             get: "/apis/v1beta1/{namespace}/workspaces/{uid}" | ||||
| @@ -59,6 +65,12 @@ service WorkspaceService { | ||||
|             delete: "/apis/v1beta1/{namespace}/workspaces/{uid}" | ||||
|         }; | ||||
| 	} | ||||
|  | ||||
| 	rpc RetryLastWorkspaceAction (RetryActionWorkspaceRequest) returns (google.protobuf.Empty) { | ||||
| 		option (google.api.http) = { | ||||
|             put: "/apis/v1beta1/{namespace}/workspaces/{uid}/retry" | ||||
|         }; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| message Workspace { | ||||
| @@ -121,6 +133,9 @@ message ListWorkspaceRequest { | ||||
| 	string namespace = 1; | ||||
| 	int32 pageSize = 2; | ||||
| 	int32 page = 3; | ||||
| 	string order = 4; | ||||
| 	string labels = 5; | ||||
| 	string phase = 6; | ||||
| } | ||||
|  | ||||
| message ListWorkspaceResponse { | ||||
| @@ -144,4 +159,35 @@ message ResumeWorkspaceRequest { | ||||
| message DeleteWorkspaceRequest { | ||||
| 	string namespace = 1; | ||||
| 	string uid = 2; | ||||
| } | ||||
|  | ||||
| message RetryActionWorkspaceRequest { | ||||
| 	string namespace = 1; | ||||
| 	string uid = 2; | ||||
| } | ||||
|  | ||||
| message WorkspaceStatisticReport { | ||||
| 	int32 total = 1; | ||||
| 	string lastCreated = 2; | ||||
| 	int32 launching = 3; | ||||
| 	int32 running = 4; | ||||
| 	int32 updating = 5; | ||||
| 	int32 pausing = 6; | ||||
| 	int32 paused = 7; | ||||
| 	int32 terminating = 8; | ||||
| 	int32 terminated = 9; | ||||
| 	int32 failedToPause = 10; | ||||
| 	int32 failedToResume = 11; | ||||
| 	int32 failedToTerminate = 12; | ||||
| 	int32 failedToLaunch = 13; | ||||
| 	int32 failedToUpdate = 14; | ||||
| 	int32 failed = 15; | ||||
| } | ||||
|  | ||||
| message GetWorkspaceStatisticsForNamespaceRequest { | ||||
| 	string namespace = 1; | ||||
| } | ||||
|  | ||||
| message GetWorkspaceStatisticsForNamespaceResponse { | ||||
| 	WorkspaceStatisticReport stats = 1; | ||||
| } | ||||
| @@ -45,6 +45,7 @@ type WorkspaceTemplate struct { | ||||
| 	WorkflowTemplate *WorkflowTemplate `protobuf:"bytes,7,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` | ||||
| 	Labels           []*KeyValue       `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty"` | ||||
| 	IsArchived       bool              `protobuf:"varint,9,opt,name=isArchived,proto3" json:"isArchived,omitempty"` | ||||
| 	Description      string            `protobuf:"bytes,10,opt,name=description,proto3" json:"description,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceTemplate) Reset() { | ||||
| @@ -142,6 +143,13 @@ func (x *WorkspaceTemplate) GetIsArchived() bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (x *WorkspaceTemplate) GetDescription() string { | ||||
| 	if x != nil { | ||||
| 		return x.Description | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type GenerateWorkspaceTemplateWorkflowTemplateRequest struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -449,6 +457,9 @@ type ListWorkspaceTemplatesRequest struct { | ||||
| 	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` | ||||
| 	PageSize  int32  `protobuf:"varint,2,opt,name=pageSize,proto3" json:"pageSize,omitempty"` | ||||
| 	Page      int32  `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` | ||||
| 	Order     string `protobuf:"bytes,4,opt,name=order,proto3" json:"order,omitempty"` | ||||
| 	Labels    string `protobuf:"bytes,5,opt,name=labels,proto3" json:"labels,omitempty"` | ||||
| 	Uid       string `protobuf:"bytes,6,opt,name=uid,proto3" json:"uid,omitempty"` | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceTemplatesRequest) Reset() { | ||||
| @@ -504,6 +515,27 @@ func (x *ListWorkspaceTemplatesRequest) GetPage() int32 { | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceTemplatesRequest) GetOrder() string { | ||||
| 	if x != nil { | ||||
| 		return x.Order | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceTemplatesRequest) GetLabels() string { | ||||
| 	if x != nil { | ||||
| 		return x.Labels | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (x *ListWorkspaceTemplatesRequest) GetUid() string { | ||||
| 	if x != nil { | ||||
| 		return x.Uid | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type ListWorkspaceTemplatesResponse struct { | ||||
| 	state         protoimpl.MessageState | ||||
| 	sizeCache     protoimpl.SizeCache | ||||
| @@ -704,7 +736,7 @@ var file_workspace_template_proto_rawDesc = []byte{ | ||||
| 	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, 0x1a, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x22, 0xb3, 0x02, 0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x22, 0xd5, 0x02, 0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, | ||||
| 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, | ||||
| @@ -723,158 +755,165 @@ var file_workspace_template_proto_rawDesc = []byte{ | ||||
| 	0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, | ||||
| 	0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x41, 0x72, 0x63, 0x68, | ||||
| 	0x69, 0x76, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x41, 0x72, | ||||
| 	0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x30, 0x47, 0x65, 0x6e, 0x65, 0x72, | ||||
| 	0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, | ||||
| 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x11, 0x77, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x22, 0x84, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x44, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, | ||||
| 	0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, | ||||
| 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x11, 0x77, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x22, 0x67, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, | ||||
| 	0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, | ||||
| 	0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, | ||||
| 	0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1f, 0x41, 0x72, | ||||
| 	0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, | ||||
| 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, | ||||
| 	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa8, 0x01, 0x0a, 0x30, 0x47, 0x65, 0x6e, | ||||
| 	0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, | ||||
| 	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x6d, 0x0a, | ||||
| 	0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, | ||||
| 	0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, | ||||
| 	0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, | ||||
| 	0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xc8, 0x01, 0x0a, | ||||
| 	0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, | ||||
| 	0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, | ||||
| 	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, | ||||
| 	0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, | ||||
| 	0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, | ||||
| 	0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, | ||||
| 	0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, | ||||
| 	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, | ||||
| 	0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, | ||||
| 	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x44, 0x0a, | ||||
| 	0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, | ||||
| 	0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x44, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, | ||||
| 	0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x1e, 0x55, | ||||
| 	0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, | ||||
| 	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x44, 0x0a, | ||||
| 	0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x22, 0x67, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, | ||||
| 	0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, | ||||
| 	0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1f, | ||||
| 	0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, | ||||
| 	0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, | ||||
| 	0x85, 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, | ||||
| 	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, | ||||
| 	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, | ||||
| 	0x46, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x32, 0xce, 0x09, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, | ||||
| 	0x76, 0x69, 0x63, 0x65, 0x12, 0xdb, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, | ||||
| 	0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x12, 0x35, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, | ||||
| 	0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x22, 0x45, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x77, 0x6f, | ||||
| 	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3a, | ||||
| 	0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x12, 0xa0, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, | ||||
| 	0x93, 0x02, 0x42, 0x22, 0x2d, 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, 0x77, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x73, 0x3a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, | ||||
| 	0xad, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, | ||||
| 	0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, | ||||
| 	0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, | ||||
| 	0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, | ||||
| 	0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, | ||||
| 	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x10, 0x0a, | ||||
| 	0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, | ||||
| 	0xc8, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, | ||||
| 	0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, | ||||
| 	0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x12, 0x77, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, | ||||
| 	0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, | ||||
| 	0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, | ||||
| 	0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, | ||||
| 	0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, | ||||
| 	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x24, 0x4c, 0x69, | ||||
| 	0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, | ||||
| 	0x69, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, | ||||
| 	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, | ||||
| 	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, | ||||
| 	0x6e, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x32, 0xce, 0x09, 0x0a, 0x18, 0x57, | ||||
| 	0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, | ||||
| 	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xdb, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, | ||||
| 	0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x35, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, | ||||
| 	0x72, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x22, 0x45, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, | ||||
| 	0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x3a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xa0, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, | ||||
| 	0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, | ||||
| 	0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, | ||||
| 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x4e, | ||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x1a, 0x33, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x76, 0x31, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x48, | ||||
| 	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x22, 0x2d, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x3a, 0x11, 0x77, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x9d, | ||||
| 	0x01, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | ||||
| 	0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, | ||||
| 	0x3d, 0x1a, 0x3b, 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, 0x77, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, | ||||
| 	0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x8d, | ||||
| 	0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, | ||||
| 	0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, | ||||
| 	0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, | ||||
| 	0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x61, 0x70, 0x69, 0x73, | ||||
| 	0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x1a, 0x33, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x98, | ||||
| 	0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x3a, 0x11, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, | ||||
| 	0x65, 0x12, 0x9d, 0x01, 0x0a, 0x18, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, | ||||
| 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x24, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, | ||||
| 	0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, | ||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x43, 0x82, 0xd3, | ||||
| 	0xe4, 0x93, 0x02, 0x3d, 0x1a, 0x3b, 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, | ||||
| 	0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, | ||||
| 	0x65, 0x12, 0x8d, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, | ||||
| 	0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, | ||||
| 	0x6c, 0x61, 0x74, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, | ||||
| 	0x7d, 0x12, 0x98, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, | ||||
| 	0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, | ||||
| 	0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, | ||||
| 	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, | ||||
| 	0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, | ||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xbc, 0x01, 0x0a, | ||||
| 	0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, | ||||
| 	0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, | ||||
| 	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, | ||||
| 	0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, | ||||
| 	0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, | ||||
| 	0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, | ||||
| 	0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, | ||||
| 	0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xbc, 0x01, 0x0a, 0x1d, 0x4c, 0x69, | ||||
| 	0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, | ||||
| 	0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, | ||||
| 	0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, | ||||
| 	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, | ||||
| 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, | ||||
| 	0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, | ||||
| 	0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, | ||||
| 	0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, | ||||
| 	0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, 0x64, 0x7d, 0x2f, | ||||
| 	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, | ||||
| 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 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, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, | ||||
| 	0x63, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x75, 0x69, | ||||
| 	0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x33, | ||||
| } | ||||
|  | ||||
| var ( | ||||
|   | ||||
| @@ -69,6 +69,7 @@ message WorkspaceTemplate { | ||||
|     WorkflowTemplate workflowTemplate = 7; | ||||
|     repeated KeyValue labels = 8; | ||||
|     bool isArchived = 9; | ||||
|     string description = 10; | ||||
| } | ||||
|  | ||||
| message GenerateWorkspaceTemplateWorkflowTemplateRequest { | ||||
| @@ -103,6 +104,9 @@ message ListWorkspaceTemplatesRequest { | ||||
|     string namespace = 1; | ||||
|     int32 pageSize = 2; | ||||
|     int32 page = 3; | ||||
|     string order = 4; | ||||
|     string labels = 5; | ||||
|     string uid = 6; | ||||
| } | ||||
|  | ||||
| message ListWorkspaceTemplatesResponse { | ||||
|   | ||||
							
								
								
									
										17
									
								
								cmd/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								cmd/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| # Helper scripts | ||||
|  | ||||
| ## gen-release-md.go | ||||
| Generates markdown for releases. | ||||
|  | ||||
| Usage: | ||||
| ```bash | ||||
| go run cmd/gen-release-md/gen-release-md.go -v=0.10.0 -u=[github-username] > /tmp/release.md | ||||
| ``` | ||||
|  | ||||
| ## goose.go | ||||
| Supports both Go and SQL migrations. | ||||
|  | ||||
| ```bash | ||||
| go run cmd/goose/goose up     # run up migrations | ||||
| go run cmd/goose/goose down   # run down migrations | ||||
| ``` | ||||
							
								
								
									
										255
									
								
								cmd/gen-release-md/gen-release-md.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								cmd/gen-release-md/gen-release-md.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,255 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type user struct { | ||||
| 	Login              string `json:"login"` | ||||
| 	URL                string `json:"html_url"` | ||||
| 	AvatarURL          string `json:"avatar_url"` | ||||
| 	ContributionsCount int | ||||
| } | ||||
|  | ||||
| type label struct { | ||||
| 	Name string `json:"name"` | ||||
| } | ||||
|  | ||||
| type pullRequest struct { | ||||
| 	URL string `json:"url"` | ||||
| } | ||||
|  | ||||
| type issue struct { | ||||
| 	Number      int          `json:"number"` | ||||
| 	URL         string       `json:"html_url"` | ||||
| 	Title       string       `json:"title"` | ||||
| 	User        user         `json:"user"` | ||||
| 	PullRequest *pullRequest `json:"pull_request"` | ||||
| 	Labels      []label      `json:"labels"` | ||||
| } | ||||
|  | ||||
| type milestone struct { | ||||
| 	Number int    `json:"number"` | ||||
| 	Title  string `json:"title"` | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	apiPrefix = "https://api.github.com/repos/" | ||||
| ) | ||||
|  | ||||
| var releaseTemplate = `# Documentation | ||||
| See https://docs.onepanel.ai | ||||
|  | ||||
| # CLI Installation | ||||
|  | ||||
| ## Linux | ||||
|  | ||||
| ` + "```" + ` | ||||
| # Download the binary | ||||
| curl -sLO https://github.com/onepanelio/core/releases/download/v%s/opctl-linux-amd64 | ||||
|  | ||||
| # Make binary executable | ||||
| chmod +x opctl-linux-amd64 | ||||
|  | ||||
| # Move binary to path | ||||
| mv ./opctl-linux-amd64 /usr/local/bin/opctl | ||||
|  | ||||
| # Test installation | ||||
| opctl version | ||||
| ` + "```" + ` | ||||
|  | ||||
| ## macOS | ||||
|  | ||||
| ` + "```" + ` | ||||
| # Download the binary | ||||
| curl -sLO https://github.com/onepanelio/core/releases/download/v%s/opctl-macos-amd64 | ||||
|  | ||||
| # Make binary executable | ||||
| chmod +x opctl-macos-amd64 | ||||
|  | ||||
| # Move binary to path | ||||
| mv ./opctl-macos-amd64 /usr/local/bin/opctl | ||||
|  | ||||
| # Test installation | ||||
| opctl version | ||||
| ` + "```" + ` | ||||
|  | ||||
| ## Windows | ||||
|  | ||||
| Download the [attached executable](https://github.com/onepanelio/core/releases/download/v%s/opctl-windows-amd64.exe), rename it to "opctl" and move it to a folder that is in your PATH environment variable. | ||||
| ` | ||||
|  | ||||
| var repositories = []string{ | ||||
| 	"onepanelio/core", | ||||
| 	"onepanelio/core-ui", | ||||
| 	"onepanelio/cli", | ||||
| 	"onepanelio/manifests", | ||||
| 	"onepanelio/core-docs", | ||||
| } | ||||
|  | ||||
| func getPrefixSection(prefix string) (section string) { | ||||
| 	switch prefix { | ||||
| 	case "feat": | ||||
| 		fallthrough | ||||
| 	case "fix": | ||||
| 		fallthrough | ||||
| 	case "docs": | ||||
| 		section = prefix | ||||
| 	default: | ||||
| 		section = "other" | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Parse issues, pulling only PRs and categorize them based on labels | ||||
| // Print everything as MD that can be copied into release notes | ||||
| func printMarkDown(issues []*issue, version *string) { | ||||
| 	contributorsMap := make(map[string]user, 0) | ||||
| 	sections := make(map[string]string, 0) | ||||
|  | ||||
| 	for _, iss := range issues { | ||||
| 		if iss.PullRequest == nil { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		parts := strings.Split(iss.Title, ":") | ||||
| 		if len(parts) > 0 { | ||||
| 			if user, ok := contributorsMap[iss.User.Login]; ok { | ||||
| 				user.ContributionsCount++ | ||||
| 				contributorsMap[iss.User.Login] = user | ||||
| 			} else { | ||||
| 				iss.User.ContributionsCount = 1 | ||||
| 				contributorsMap[iss.User.Login] = iss.User | ||||
| 			} | ||||
| 			sections[getPrefixSection(parts[0])] += fmt.Sprintf("- %s ([#%d](%s))\n", iss.Title, iss.Number, iss.URL) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	releaseTemplate := fmt.Sprintf(releaseTemplate, *version, *version, *version) | ||||
| 	fmt.Println(releaseTemplate) | ||||
| 	fmt.Println("# Changelog") | ||||
| 	if sections["feat"] != "" { | ||||
| 		fmt.Println("## Features") | ||||
| 		fmt.Println(sections["feat"]) | ||||
| 	} | ||||
| 	if sections["fix"] != "" { | ||||
| 		fmt.Println("## Fixes") | ||||
| 		fmt.Println(sections["fix"]) | ||||
| 	} | ||||
| 	if sections["docs"] != "" { | ||||
| 		fmt.Println("## Docs") | ||||
| 		fmt.Println(sections["docs"]) | ||||
| 	} | ||||
| 	if sections["other"] != "" { | ||||
| 		fmt.Println("## Other") | ||||
| 		fmt.Println(sections["other"]) | ||||
| 	} | ||||
|  | ||||
| 	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 }) | ||||
| 	for _, user := range contributors { | ||||
| 		fmt.Println(fmt.Sprintf("- <a href=\"%s\"><img src=\"%s\" width=\"12\"/> <strong>%s</strong></a> %s", user.URL, user.AvatarURL, user.Login, user.Login)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func httpGet(url string, username, token *string) (*http.Response, error) { | ||||
| 	client := &http.Client{} | ||||
| 	req, err := http.NewRequest(http.MethodGet, url, nil) | ||||
| 	if username != nil { | ||||
| 		req.SetBasicAuth(*username, *token) | ||||
| 	} | ||||
| 	res, err := client.Do(req) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return res, nil | ||||
| } | ||||
|  | ||||
| // Get milestone by title | ||||
| func getMilestone(repository string, version, username, token *string) (*milestone, error) { | ||||
| 	url := fmt.Sprintf("%s%s/milestones", apiPrefix, repository) | ||||
| 	res, err := httpGet(url, username, token) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer res.Body.Close() | ||||
|  | ||||
| 	if res.StatusCode != http.StatusOK { | ||||
| 		return nil, errors.New("API rate limit exceeded") | ||||
| 	} | ||||
|  | ||||
| 	milestones := make([]*milestone, 0) | ||||
| 	if err = json.NewDecoder(res.Body).Decode(&milestones); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	for _, milestone := range milestones { | ||||
| 		if milestone.Title == "v"+*version { | ||||
| 			return milestone, nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil, errors.New("milestone not found") | ||||
| } | ||||
|  | ||||
| // Get issues from repository | ||||
| func getIssues(repository string, milestone *milestone, username, token *string) ([]*issue, error) { | ||||
| 	url := fmt.Sprintf("%s%s/issues?state=closed&direction=asc&milestone=%d", apiPrefix, repository, milestone.Number) | ||||
| 	res, err := httpGet(url, username, token) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer res.Body.Close() | ||||
|  | ||||
| 	if res.StatusCode != http.StatusOK { | ||||
| 		return nil, errors.New("API rate limit exceeded") | ||||
| 	} | ||||
|  | ||||
| 	issues := make([]*issue, 0) | ||||
| 	if err = json.NewDecoder(res.Body).Decode(&issues); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return issues, nil | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	version := flag.String("v", "1.0.0", "Version of release, example: -v=1.0.0") | ||||
| 	username := flag.String("u", "", "GitHub username for request, example: -u=octocat") | ||||
| 	token := flag.String("t", "", "GitHub token for request, example: -t=<token>") | ||||
|  | ||||
| 	flag.Parse() | ||||
|  | ||||
| 	issues := make([]*issue, 0) | ||||
| 	for _, repository := range repositories { | ||||
| 		mil, err := getMilestone(repository, version, username, token) | ||||
| 		if err != nil { | ||||
| 			fmt.Printf(err.Error()) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		iss, err := getIssues(repository, mil, username, token) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		issues = append(issues, iss...) | ||||
| 	} | ||||
|  | ||||
| 	printMarkDown(issues, version) | ||||
| } | ||||
							
								
								
									
										62
									
								
								cmd/goose/goose.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								cmd/goose/goose.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| // This is custom goose binary to support .go migration files in ./db dir | ||||
|  | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	migrations "github.com/onepanelio/core/db/go" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
|  | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	flags = flag.NewFlagSet("goose", flag.ExitOnError) | ||||
| 	dir   = flags.String("dir", ".", "directory with migration files") | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	flags.Parse(os.Args[1:]) | ||||
| 	args := flags.Args() | ||||
|  | ||||
| 	if len(args) < 1 { | ||||
| 		flags.Usage() | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	kubeConfig := v1.NewConfig() | ||||
| 	client, err := v1.NewClient(kubeConfig, nil, nil) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Failed to connect to Kubernetes cluster: %v", err) | ||||
| 	} | ||||
| 	config, err := client.GetSystemConfig() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Failed to get system config: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	dbDriverName, dbDataSourceName := config.DatabaseConnection() | ||||
| 	db := sqlx.MustConnect(dbDriverName, dbDataSourceName) | ||||
| 	defer db.Close() | ||||
|  | ||||
| 	command := args[0] | ||||
|  | ||||
| 	arguments := []string{} | ||||
| 	if len(args) > 2 { | ||||
| 		arguments = append(arguments, args[2:]...) | ||||
| 	} | ||||
|  | ||||
| 	goose.SetTableName("goose_db_version") | ||||
| 	if err := goose.Run(command, db.DB, filepath.Join(*dir, "sql"), arguments...); err != nil { | ||||
| 		log.Fatalf("Failed to run database sql migrations: %v %v", command, err) | ||||
| 	} | ||||
|  | ||||
| 	goose.SetTableName("goose_db_go_version") | ||||
| 	migrations.Initialize() | ||||
| 	if err := goose.Run(command, db.DB, filepath.Join(*dir, "go"), arguments...); err != nil { | ||||
| 		log.Fatalf("Failed to run database go migrations: %v %v", command, err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										137
									
								
								db/go/20200525160514_add_jupyter_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								db/go/20200525160514_add_jupyter_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| // Package migration is for carrying out migrations against the database. | ||||
| // To support Onepanel Core operations. | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| 	"log" | ||||
| ) | ||||
|  | ||||
| const jupyterWorkspaceTemplate = `# Docker containers that are part of the Workspace | ||||
| containers: | ||||
| - name: jupyterlab-tensorflow | ||||
|   image: jupyter/tensorflow-notebook | ||||
|   command: [start.sh, jupyter] | ||||
|   env: | ||||
|     - name: tornado | ||||
|       value: "{ 'headers': { 'Content-Security-Policy': \"frame-ancestors * 'self'\" }  }" | ||||
|   args: | ||||
|     - lab | ||||
|     - --LabApp.token='' | ||||
|     - --LabApp.allow_remote_access=True | ||||
|     - --LabApp.allow_origin="*" | ||||
|     - --LabApp.disable_check_xsrf=True | ||||
|     - --LabApp.trust_xheaders=True | ||||
|     - --LabApp.tornado_settings=$(tornado) | ||||
|     - --notebook-dir='/data' | ||||
|   ports: | ||||
|   - containerPort: 8888 | ||||
|     name: jupyterlab | ||||
|   # Volumes to be mounted in this container | ||||
|   # Onepanel will automatically create these volumes and mount them to the container | ||||
|   volumeMounts: | ||||
|   - name: data | ||||
|     mountPath: /data | ||||
| # Ports that need to be exposed | ||||
| ports: | ||||
| - name: jupyterlab | ||||
|   port: 80 | ||||
|   protocol: TCP | ||||
|   targetPort: 8888 | ||||
| # Routes that will map to ports | ||||
| routes: | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
| # DAG Workflow to be executed once a Workspace action completes | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| const jupyterLabTemplateName = "JupyterLab" | ||||
|  | ||||
| func initialize20200525160514() { | ||||
| 	if _, ok := initializedMigrations[20200525160514]; !ok { | ||||
| 		goose.AddMigration(Up20200525160514, Down20200525160514) | ||||
| 		initializedMigrations[20200525160514] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func Up20200525160514(tx *sql.Tx) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200525160514]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		Name:     jupyterLabTemplateName, | ||||
| 		Manifest: jupyterWorkspaceTemplate, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.CreateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func Down20200525160514(tx *sql.Tx) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	uid, err := uid2.GenerateUID(jupyterLabTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.ArchiveWorkspaceTemplate(namespace.Name, uid); err != nil { | ||||
| 			log.Fatalf("error %v", err.Error()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										189
									
								
								db/go/20200528140124_add_cvat_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								db/go/20200528140124_add_cvat_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,189 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| 	"log" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate = `# Docker containers that are part of the Workspace | ||||
| 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:v0.7.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 | ||||
|   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: cvat-ui | ||||
|   image: onepanel/cvat-ui:v0.7.0 | ||||
|   ports: | ||||
|   - containerPort: 80 | ||||
|     name: http | ||||
| ports: | ||||
| - name: cvat-ui | ||||
|   port: 80 | ||||
|   protocol: TCP | ||||
|   targetPort: 80 | ||||
| - name: cvat | ||||
|   port: 8080 | ||||
|   protocol: TCP | ||||
|   targetPort: 8080 | ||||
| routes: | ||||
| - match: | ||||
|   - uri: | ||||
|       regex: /api/.*|/git/.*|/tensorflow/.*|/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 | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| const cvatTemplateName = "CVAT" | ||||
|  | ||||
| func initialize20200528140124() { | ||||
| 	if _, ok := initializedMigrations[20200528140124]; !ok { | ||||
| 		goose.AddMigration(Up20200528140124, Down20200528140124) | ||||
| 		initializedMigrations[20200528140124] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200528140124 will insert the cvatTemplate to each user. | ||||
| // Each user is determined by onepanel enabled namespaces. | ||||
| // Any errors reported are logged as fatal. | ||||
| func Up20200528140124(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
|  | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200528140124]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		Name:     cvatTemplateName, | ||||
| 		Manifest: cvatWorkspaceTemplate, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.CreateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200528140124 will attempt to remove cvatTemplate from each user. | ||||
| // Each user is determined by onepanel enabled namespaces. | ||||
| // DB entries are archived, K8S components are deleted. | ||||
| // Active workspaces with that template are terminated. | ||||
| // Any errors reported are logged as fatal. | ||||
| func Down20200528140124(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
|  | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.ArchiveWorkspaceTemplate(namespace.Name, uid); err != nil { | ||||
| 			log.Fatalf("error %v", err.Error()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										164
									
								
								db/go/20200605090509_add_pytorch_workflow_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								db/go/20200605090509_add_pytorch_workflow_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"log" | ||||
|  | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const pytorchMnistWorkflowTemplate = `entrypoint: main | ||||
| arguments: | ||||
|     parameters: | ||||
|     - name: source | ||||
|       value: https://github.com/onepanelio/pytorch-examples.git | ||||
|     - name: command | ||||
|       value: "python mnist/main.py --epochs=1" | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: data | ||||
|     spec: | ||||
|       accessModes: [ "ReadWriteOnce" ] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 2Gi | ||||
|   - metadata: | ||||
|       name: output | ||||
|     spec: | ||||
|       accessModes: [ "ReadWriteOnce" ] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 2Gi | ||||
| templates: | ||||
|   - name: main | ||||
|     dag: | ||||
|       tasks: | ||||
|       - name: train-model | ||||
|         template: pytorch | ||||
| # Uncomment section below to send metrics to Slack | ||||
| #      - name: notify-in-slack | ||||
| #        dependencies: [train-model] | ||||
| #        template: slack-notify-success | ||||
| #        arguments: | ||||
| #          parameters: | ||||
| #          - name: status | ||||
| #            value: "{{tasks.train-model.status}}" | ||||
| #          artifacts: | ||||
| #          - name: metrics | ||||
| #            from: "{{tasks.train-model.outputs.artifacts.sys-metrics}}" | ||||
|   - name: pytorch | ||||
|     inputs: | ||||
|       artifacts: | ||||
|       - name: src | ||||
|         path: /mnt/src | ||||
|         git: | ||||
|           repo: "{{workflow.parameters.source}}" | ||||
|     outputs: | ||||
|       artifacts: | ||||
|       - name: model | ||||
|         path: /mnt/output | ||||
|         optional: true | ||||
|         archive: | ||||
|           none: {} | ||||
|     container: | ||||
|       image: pytorch/pytorch:latest | ||||
|       command: [sh,-c] | ||||
|       args: ["{{workflow.parameters.command}}"] | ||||
|       workingDir: /mnt/src | ||||
|       volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /mnt/data | ||||
|       - name: output | ||||
|         mountPath: /mnt/output | ||||
|   - name: slack-notify-success | ||||
|     container: | ||||
|       image: technosophos/slack-notify | ||||
|       command: [sh,-c] | ||||
|       args: ['SLACK_USERNAME=Worker SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify'] | ||||
|     inputs: | ||||
|       parameters: | ||||
|       - name: status | ||||
|       artifacts: | ||||
|       - name: metrics | ||||
|         path: /tmp/metrics.json | ||||
|         optional: true | ||||
| ` | ||||
|  | ||||
| const pytorchMnistWorkflowTemplateName = "PyTorch Training" | ||||
|  | ||||
| func initialize20200605090509() { | ||||
| 	if _, ok := initializedMigrations[20200605090509]; !ok { | ||||
| 		goose.AddMigration(Up20200605090509, Down20200605090509) | ||||
| 		initializedMigrations[20200605090509] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200605090509 will insert a Pytorch workflow template to each user. | ||||
| // Each user is determined by onepanel enabled namespaces. | ||||
| // Any errors reported are logged as fatal. | ||||
| func Up20200605090509(tx *sql.Tx) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200605090509]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	workflowTemplate := &v1.WorkflowTemplate{ | ||||
| 		Name:     pytorchMnistWorkflowTemplateName, | ||||
| 		Manifest: pytorchMnistWorkflowTemplate, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.CreateWorkflowTemplate(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200605090509 will attempt to remove Pytorch workflow from each user. | ||||
| // Each user is determined by onepanel enabled namespaces. | ||||
| // DB entries are archived, K8S components are deleted. | ||||
| // Active workflows with that template are terminated. | ||||
| // Any errors reported are logged as fatal. | ||||
| func Down20200605090509(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(pytorchMnistWorkflowTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.ArchiveWorkflowTemplate(namespace.Name, uid); err != nil { | ||||
| 			log.Fatalf("error %v", err.Error()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										163
									
								
								db/go/20200605090535_add_tensorflow_workflow_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								db/go/20200605090535_add_tensorflow_workflow_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"log" | ||||
|  | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const tensorflowWorkflowTemplate = `entrypoint: main | ||||
| arguments: | ||||
|     parameters: | ||||
|     - name: source | ||||
|       value: https://github.com/onepanelio/tensorflow-examples.git | ||||
|     - name: command | ||||
|       value: "python mnist/main.py --epochs=5" | ||||
| volumeClaimTemplates: | ||||
|   - metadata: | ||||
|       name: data | ||||
|     spec: | ||||
|       accessModes: [ "ReadWriteOnce" ] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 2Gi | ||||
|   - metadata: | ||||
|       name: output | ||||
|     spec: | ||||
|       accessModes: [ "ReadWriteOnce" ] | ||||
|       resources: | ||||
|         requests: | ||||
|           storage: 2Gi | ||||
| templates: | ||||
|   - name: main | ||||
|     dag: | ||||
|       tasks: | ||||
|       - name: train-model | ||||
|         template: pytorch | ||||
| # Uncomment section below to send metrics to Slack | ||||
| #      - name: notify-in-slack | ||||
| #        dependencies: [train-model] | ||||
| #        template: slack-notify-success | ||||
| #        arguments: | ||||
| #          parameters: | ||||
| #          - name: status | ||||
| #            value: "{{tasks.train-model.status}}" | ||||
| #          artifacts: | ||||
| #          - name: metrics | ||||
| #            from: "{{tasks.train-model.outputs.artifacts.sys-metrics}}" | ||||
|   - name: pytorch | ||||
|     inputs: | ||||
|       artifacts: | ||||
|       - name: src | ||||
|         path: /mnt/src | ||||
|         git: | ||||
|           repo: "{{workflow.parameters.source}}" | ||||
|     outputs: | ||||
|       artifacts: | ||||
|       - name: model | ||||
|         path: /mnt/output | ||||
|         optional: true | ||||
|         archive: | ||||
|           none: {} | ||||
|     container: | ||||
|       image: tensorflow/tensorflow:latest | ||||
|       command: [sh,-c] | ||||
|       args: ["{{workflow.parameters.command}}"] | ||||
|       workingDir: /mnt/src | ||||
|       volumeMounts: | ||||
|       - name: data | ||||
|         mountPath: /mnt/data | ||||
|       - name: output | ||||
|         mountPath: /mnt/output | ||||
|   - name: slack-notify-success | ||||
|     container: | ||||
|       image: technosophos/slack-notify | ||||
|       command: [sh,-c] | ||||
|       args: ['SLACK_USERNAME=Worker SLACK_TITLE="{{workflow.name}} {{inputs.parameters.status}}" SLACK_ICON=https://www.gravatar.com/avatar/5c4478592fe00878f62f0027be59c1bd SLACK_MESSAGE=$(cat /tmp/metrics.json)} ./slack-notify'] | ||||
|     inputs: | ||||
|       parameters: | ||||
|       - name: status | ||||
|       artifacts: | ||||
|       - name: metrics | ||||
|         path: /tmp/metrics.json | ||||
|         optional: true | ||||
| ` | ||||
|  | ||||
| const tensorflowWorkflowTemplateName = "TensorFlow Training" | ||||
|  | ||||
| func initialize20200605090535() { | ||||
| 	if _, ok := initializedMigrations[20200605090535]; !ok { | ||||
| 		goose.AddMigration(Up20200605090535, Down20200605090535) | ||||
| 		initializedMigrations[20200605090535] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200605090535 will insert a tensorflow workflow template to each user. | ||||
| // Each user is determined by onepanel enabled namespaces. | ||||
| // Any errors reported are logged as fatal. | ||||
| func Up20200605090535(tx *sql.Tx) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200605090535]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	workflowTemplate := &v1.WorkflowTemplate{ | ||||
| 		Name:     tensorflowWorkflowTemplateName, | ||||
| 		Manifest: tensorflowWorkflowTemplate, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.CreateWorkflowTemplate(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200605090535 will attempt to remove tensorflow workflow from each user. | ||||
| // Each user is determined by onepanel enabled namespaces. | ||||
| // DB entries are archived, K8S components are deleted. | ||||
| // Active workflows with that template are terminated. | ||||
| // Any errors reported are logged as fatal. | ||||
| func Down20200605090535(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(tensorflowWorkflowTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.ArchiveWorkflowTemplate(namespace.Name, uid); err != nil { | ||||
| 			log.Fatalf("error %v", err.Error()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										175
									
								
								db/go/20200626113635_update_cvat_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								db/go/20200626113635_update_cvat_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate2 = `# Docker containers that are part of the Workspace | ||||
| 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:v0.7.6 | ||||
|   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 | ||||
|   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: cvat-ui | ||||
|   image: onepanel/cvat-ui:v0.7.5 | ||||
|   ports: | ||||
|   - containerPort: 80 | ||||
|     name: http | ||||
| - name: filesyncer | ||||
|   image: onepanel/filesyncer:v0.0.4 | ||||
|   command: ['python3', 'main.py'] | ||||
|   volumeMounts: | ||||
|   - name: share | ||||
|     mountPath: /mnt/share | ||||
| ports: | ||||
| - name: cvat-ui | ||||
|   port: 80 | ||||
|   protocol: TCP | ||||
|   targetPort: 80 | ||||
| - name: cvat | ||||
|   port: 8080 | ||||
|   protocol: TCP | ||||
|   targetPort: 8080 | ||||
| routes: | ||||
| - match: | ||||
|   - uri: | ||||
|       regex: /api/.*|/git/.*|/tensorflow/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|   - queryParams: | ||||
|       id: | ||||
|         regex: \d+.* | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 8080 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| func initialize20200626113635() { | ||||
| 	if _, ok := initializedMigrations[20200626113635]; !ok { | ||||
| 		goose.AddMigration(Up20200626113635, Down20200626113635) | ||||
| 		initializedMigrations[20200626113635] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200626113635 updates the CVAT template to a new version. | ||||
| func Up20200626113635(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200626113635]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     cvatTemplateName, | ||||
| 			Manifest: cvatWorkspaceTemplate2, | ||||
| 		} | ||||
|  | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200626113635 removes the CVAT template update | ||||
| func Down20200626113635(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										176
									
								
								db/go/20200704151301_update_cvat_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								db/go/20200704151301_update_cvat_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate3 = `# Docker containers that are part of the Workspace | ||||
| 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:v0.7.10-stable | ||||
|   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 | ||||
|   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: cvat-ui | ||||
|   image: onepanel/cvat-ui:v0.7.10-stable | ||||
|   ports: | ||||
|   - containerPort: 80 | ||||
|     name: http | ||||
| # Uncomment following lines to enable S3 FileSyncer | ||||
| # Refer to https://docs.onepanel.ai/docs/getting-started/use-cases/computervision/annotation/cvat/cvat_quick_guide#setting-up-environment-variables | ||||
| #- name: filesyncer | ||||
| #  image: onepanel/filesyncer:v0.0.4 | ||||
| #  command: ['python3', 'main.py'] | ||||
| #  volumeMounts: | ||||
| #  - name: share | ||||
| #    mountPath: /mnt/share | ||||
| ports: | ||||
| - name: cvat-ui | ||||
|   port: 80 | ||||
|   protocol: TCP | ||||
|   targetPort: 80 | ||||
| - name: cvat | ||||
|   port: 8080 | ||||
|   protocol: TCP | ||||
|   targetPort: 8080 | ||||
| routes: | ||||
| - match: | ||||
|   - uri: | ||||
|       regex: /api/.*|/git/.*|/tensorflow/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|   - queryParams: | ||||
|       id: | ||||
|         regex: \d+.* | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 8080 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| func initialize20200704151301() { | ||||
| 	if _, ok := initializedMigrations[20200704151301]; !ok { | ||||
| 		goose.AddMigration(Up20200704151301, Down20200704151301) | ||||
| 		initializedMigrations[20200704151301] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200704151301 updates the CVAT template to a new version. | ||||
| func Up20200704151301(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200704151301]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     cvatTemplateName, | ||||
| 			Manifest: cvatWorkspaceTemplate3, | ||||
| 		} | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200704151301 removes the CVAT template update | ||||
| func Down20200704151301(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										205
									
								
								db/go/20200724220450_update_cvat_workspace.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								db/go/20200724220450_update_cvat_workspace.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate4 = `# Workspace arguments | ||||
| arguments: | ||||
|   parameters: | ||||
|   - name: storage-prefix | ||||
|     displayName: Directory in default object storage | ||||
|     value: data | ||||
|     hint: Location of data and models in default object storage, will continuously sync to '/mnt/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:v0.7.10-stable | ||||
|   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 | ||||
|   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:v0.7.10-stable | ||||
|   ports: | ||||
|   - containerPort: 80 | ||||
|     name: http | ||||
| # You can add multiple FileSyncer sidecar containers if needed | ||||
| - name: filesyncer | ||||
|   image: onepanel/filesyncer:{{.ArtifactRepositoryType}} | ||||
|   args: | ||||
|   - download | ||||
|   env: | ||||
|   - name: FS_PATH | ||||
|     value: /mnt/share | ||||
|   - name: FS_PREFIX | ||||
|     value: '{{workspace.parameters.storage-prefix}}' | ||||
|   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 | ||||
| routes: | ||||
| - match: | ||||
|   - uri: | ||||
|       regex: /api/.*|/git/.*|/tensorflow/.*|/auto_annotation/.*|/analytics/.*|/static/.*|/admin/.*|/documentation/.*|/dextr/.*|/reid/.* | ||||
|   - queryParams: | ||||
|       id: | ||||
|         regex: \d+.* | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 8080 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| func initialize20200724220450() { | ||||
| 	if _, ok := initializedMigrations[20200724220450]; !ok { | ||||
| 		goose.AddMigration(Up20200724220450, Down20200724220450) | ||||
| 		initializedMigrations[20200724220450] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200724220450 updates the CVAT template to a new version. | ||||
| func Up20200724220450(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200724220450]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		artifactRepositoryType := "s3" | ||||
| 		nsConfig, err := client.GetNamespaceConfig(namespace.Name) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if nsConfig.ArtifactRepository.GCS != nil { | ||||
| 			artifactRepositoryType = "gcs" | ||||
| 		} | ||||
|  | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     cvatTemplateName, | ||||
| 			Manifest: cvatWorkspaceTemplate4, | ||||
| 		} | ||||
| 		workspaceTemplate.Manifest = strings.NewReplacer( | ||||
| 			"{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workspaceTemplate.Manifest) | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200724220450 rolls back the CVAT template version | ||||
| func Down20200724220450(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
| @@ -0,0 +1,74 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"github.com/onepanelio/core/pkg/util/request/pagination" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20200727144157() { | ||||
| 	if _, ok := initializedMigrations[20200727144157]; !ok { | ||||
| 		goose.AddMigration(Up20200727144157, Down20200727144157) | ||||
| 		initializedMigrations[20200727144157] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200727144157 will go through all WorkflowTemplateVersion database entries | ||||
| // and attempt to generate the "parameters" column from the "manifests" column. | ||||
| func Up20200727144157(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
|  | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200727144157]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	pageSize := int32(100) | ||||
| 	page := int32(0) | ||||
| 	paginator := pagination.NewRequest(page, pageSize) | ||||
| 	wtvsResults := -1 | ||||
| 	for wtvsResults != 0 { | ||||
| 		wtvs, err := client.ListWorkflowTemplateVersionsAll(&paginator) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		//Exit condition; Check for more results | ||||
| 		wtvsResults = len(wtvs) | ||||
| 		if wtvsResults > 0 { | ||||
| 			page++ | ||||
| 			paginator = pagination.NewRequest(page, pageSize) | ||||
| 		} | ||||
|  | ||||
| 		for _, wtv := range wtvs { | ||||
| 			params, err := v1.ParseParametersFromManifest([]byte(wtv.Manifest)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			wtv.Parameters = params | ||||
| 			err = client.UpdateWorkflowTemplateVersion(wtv) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200727144157 can be run before 20200727155027_add_parameters_col_to_workflow_template_version.sql | ||||
| // Nothing happens because the referenced SQL file will drop the "parameters" column. | ||||
| func Down20200727144157(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										42
									
								
								db/go/20200728190804_update_workflow_template_labels.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								db/go/20200728190804_update_workflow_template_labels.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20200728190804() { | ||||
| 	if _, ok := initializedMigrations[20200728190804]; !ok { | ||||
| 		goose.AddMigration(Up20200728190804, Down20200728190804) | ||||
| 		initializedMigrations[20200728190804] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200728190804 is a legacy migration. Due to code changes, it no longer does anything. | ||||
| // It used to update labels so that we keep track of WorkflowTemplate labels. | ||||
| // Before, only workflow template versions had labels, but to speed up some queries, we now cache the latest version's labels | ||||
| // for workflow templates themselves. | ||||
| func Up20200728190804(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	if migrationHasAlreadyBeenRun(20200728190804) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Do nothing, be preserve for legacy. | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200728190804 rolls down the migration by deleting all workflow template labels, since they did not exist before this | ||||
| func Down20200728190804(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
|  | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	return client.DeleteResourceLabels(tx, v1.TypeWorkflowTemplate) | ||||
| } | ||||
							
								
								
									
										510
									
								
								db/go/20200812104328_update_maskrcnn_and_tf_od.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										510
									
								
								db/go/20200812104328_update_maskrcnn_and_tf_od.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,510 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"github.com/pressly/goose" | ||||
| 	"log" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| const maskRCNNWorkflowTemplate = `arguments: | ||||
|   parameters: | ||||
|   - name: source | ||||
|     value: https://github.com/onepanelio/Mask_RCNN.git | ||||
|     displayName: Model source code | ||||
|     type: hidden | ||||
|     visibility: private | ||||
|  | ||||
|   - name: sys-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: sys-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: sys-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: sys-num-classes | ||||
|     displayName: Number of classes | ||||
|     hint: Number of classes (i.e in CVAT taks) + 1 for background | ||||
|     value: 81 | ||||
|     visibility: private | ||||
|      | ||||
|   - name: extras | ||||
|     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." | ||||
|      | ||||
|   - name: dump-format | ||||
|     type: select.select | ||||
|     value: cvat_coco | ||||
|     displayName: CVAT dump format | ||||
|     visibility: public | ||||
|     options: | ||||
|     - name: 'MS COCO' | ||||
|       value: 'cvat_coco' | ||||
|     - name: 'TF Detection API' | ||||
|       value: 'cvat_tfrecord' | ||||
|        | ||||
|   - 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 | ||||
|  | ||||
| entrypoint: main | ||||
| templates: | ||||
| - 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: main | ||||
| - 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.extras}}"  \ | ||||
|         --ref_model_path="{{workflow.parameters.sys-finetune-checkpoint}}"  \ | ||||
|         --num_classes="{{workflow.parameters.sys-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}}' | ||||
|   inputs: | ||||
|     artifacts: | ||||
|     - name: data | ||||
|       path: /mnt/data/datasets/ | ||||
|       {{.ArtifactRepositoryType}}: | ||||
|         key: '{{workflow.namespace}}/{{workflow.parameters.sys-annotation-path}}' | ||||
|     - git: | ||||
|         repo: '{{workflow.parameters.source}}' | ||||
|         revision: "no-boto" | ||||
|       name: src | ||||
|       path: /mnt/src | ||||
|   name: tensorflow | ||||
|   outputs: | ||||
|     artifacts: | ||||
|     - name: model | ||||
|       optional: true | ||||
|       path: /mnt/output | ||||
|       {{.ArtifactRepositoryType}}: | ||||
|         key: '{{workflow.namespace}}/{{workflow.parameters.sys-output-path}}' | ||||
| # 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` | ||||
|  | ||||
| const maskRCNNWorkflowTemplateName = "MaskRCNN Training" | ||||
|  | ||||
| const tensorflowObjectDetectionWorkflowTemplate = `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: sys-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. | ||||
|  | ||||
|   - name: sys-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: ref-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: extras | ||||
|     value: |- | ||||
|       epochs=1000 | ||||
|     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: sys-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: sys-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 | ||||
| entrypoint: main | ||||
| templates: | ||||
| - 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: main | ||||
| - 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.extras}}" \ | ||||
|         --model="{{workflow.parameters.ref-model}}" \ | ||||
|         --num_classes="{{workflow.parameters.sys-num-classes}}" \ | ||||
|         --sys_finetune_checkpoint={{workflow.parameters.sys-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}}' | ||||
|   inputs: | ||||
|     artifacts: | ||||
|     - name: data | ||||
|       path: /mnt/data/datasets/ | ||||
|       {{.ArtifactRepositoryType}}: | ||||
|         key: '{{workflow.namespace}}/{{workflow.parameters.sys-annotation-path}}' | ||||
|     - name: models | ||||
|       path: /mnt/data/models/ | ||||
|       optional: true | ||||
|       {{.ArtifactRepositoryType}}: | ||||
|         key: '{{workflow.namespace}}/{{workflow.parameters.sys-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 | ||||
|   name: tensorflow | ||||
|   outputs: | ||||
|     artifacts: | ||||
|     - name: model | ||||
|       optional: true | ||||
|       path: /mnt/output | ||||
|       {{.ArtifactRepositoryType}}: | ||||
|         key: '{{workflow.namespace}}/{{workflow.parameters.sys-output-path}}' | ||||
| # 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` | ||||
|  | ||||
| const tensorflowObjectDetectionWorkflowTemplateName = "TF Object Detection Training" | ||||
|  | ||||
| func initialize20200812104328() { | ||||
| 	if _, ok := initializedMigrations[20200812104328]; !ok { | ||||
| 		goose.AddMigration(Up20200812104328, Down20200812104328) | ||||
| 		initializedMigrations[20200812104328] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200812104328 runs the migration to update MaskRCNN and TF_OD templates | ||||
| func Up20200812104328(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200812104328]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Create maskrcnn | ||||
| 	workflowTemplate := &v1.WorkflowTemplate{ | ||||
| 		Name:     maskRCNNWorkflowTemplateName, | ||||
| 		Manifest: maskRCNNWorkflowTemplate, | ||||
| 		Labels: map[string]string{ | ||||
| 			"used-by": "cvat", | ||||
| 		}, | ||||
| 	} | ||||
| 	if err := workflowTemplate.GenerateUID(workflowTemplate.Name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		existingWorkflowTemplate, err := client.GetLatestWorkflowTemplate(namespace.Name, workflowTemplate.UID) | ||||
| 		if err != nil { | ||||
| 			if strings.Contains(err.Error(), "Workflow template not found") { | ||||
| 				err = nil | ||||
| 				existingWorkflowTemplate = nil | ||||
| 			} else { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if existingWorkflowTemplate != nil { | ||||
| 			log.Printf("Skipping creating template '%v'. It already exists in namespace '%v'", workflowTemplate.Name, namespace.Name) | ||||
| 			continue | ||||
| 		} | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.CreateWorkflowTemplate(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Create tf-od | ||||
| 	workflowTemplate = &v1.WorkflowTemplate{ | ||||
| 		Name:     tensorflowObjectDetectionWorkflowTemplateName, | ||||
| 		Manifest: tensorflowObjectDetectionWorkflowTemplate, | ||||
| 		Labels: map[string]string{ | ||||
| 			"used-by": "cvat", | ||||
| 		}, | ||||
| 	} | ||||
| 	if err := workflowTemplate.GenerateUID(workflowTemplate.Name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.CreateWorkflowTemplate(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200812104328 does nothing | ||||
| func Down20200812104328(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										213
									
								
								db/go/20200812113316_update_cvat.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								db/go/20200812113316_update_cvat.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,213 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate5 = `# 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.12.0_cvat.1.0.0-beta.2-cuda | ||||
|   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.12.0_cvat.1.0.0-beta.2 | ||||
|   ports: | ||||
|   - containerPort: 80 | ||||
|     name: http | ||||
| # You can add multiple FileSyncer sidecar containers if needed | ||||
| - name: filesyncer | ||||
|   image: onepanel/filesyncer:{{.ArtifactRepositoryType}} | ||||
|   imagePullPolicy: Always | ||||
|   args: | ||||
|   - download | ||||
|   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 | ||||
| routes: | ||||
| - 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 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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` | ||||
|  | ||||
| func initialize20200812113316() { | ||||
| 	if _, ok := initializedMigrations[20200812113316]; !ok { | ||||
| 		goose.AddMigration(Up20200812113316, Down20200812113316) | ||||
| 		initializedMigrations[20200812113316] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200812113316 runs the go migration to update cvat template | ||||
| func Up20200812113316(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200812113316]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		artifactRepositoryType := "s3" | ||||
| 		nsConfig, err := client.GetNamespaceConfig(namespace.Name) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if nsConfig.ArtifactRepository.GCS != nil { | ||||
| 			artifactRepositoryType = "gcs" | ||||
| 		} | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:         uid, | ||||
| 			Name:        cvatTemplateName, | ||||
| 			Manifest:    cvatWorkspaceTemplate5, | ||||
| 			Description: "Powerful and efficient Computer Vision Annotation Tool (CVAT)", | ||||
| 		} | ||||
| 		workspaceTemplate.Manifest = strings.NewReplacer( | ||||
| 			"{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workspaceTemplate.Manifest) | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200812113316 does nothing | ||||
| func Down20200812113316(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										58
									
								
								db/go/20200814160856_add_description_to_jupyter_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								db/go/20200814160856_add_description_to_jupyter_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20200814160856() { | ||||
| 	if _, ok := initializedMigrations[20200814160856]; !ok { | ||||
| 		goose.AddMigration(Up20200814160856, Down20200814160856) | ||||
| 		initializedMigrations[20200814160856] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200814160856 runs a migration to add description to jupyterlab template | ||||
| func Up20200814160856(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200814160856]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate, err := client.GetWorkspaceTemplate(namespace.Name, "jupyterlab", 0) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		workspaceTemplate.Description = "Interactive development environment for notebooks" | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200814160856 does nothing | ||||
| func Down20200814160856(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										155
									
								
								db/go/20200821162630_update_jupyter_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								db/go/20200821162630_update_jupyter_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const jupyterWorkspaceTemplate2 = `# Docker containers that are part of the Workspace | ||||
| containers: | ||||
| - name: jupyterlab-tensorflow | ||||
|   image: onepanel/jupyterlab:1.0.1 | ||||
|   command: ["/bin/bash", "-c", "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 | ||||
| ` | ||||
|  | ||||
| func initialize20200821162630() { | ||||
| 	if _, ok := initializedMigrations[20200821162630]; !ok { | ||||
| 		goose.AddMigration(Up20200821162630, Down20200821162630) | ||||
| 		initializedMigrations[20200821162630] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //Up20200821162630 updates jupyterlab workspace with new features. | ||||
| // Tensorflow 2.3 compiled to support CUDA 10.2 and cudnn8 | ||||
| // Pytorch with GPU support. | ||||
| // OpenCV compiled from source with CUDA support. | ||||
| // Miniconda, Jupyterlab 2.2+, and lots of neat extensions. | ||||
| func Up20200821162630(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200821162630]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(jupyterLabTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:      uid, | ||||
| 			Name:     jupyterLabTemplateName, | ||||
| 			Manifest: jupyterWorkspaceTemplate2, | ||||
| 		} | ||||
|  | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200821162630 removes the JupyterLab template update | ||||
| func Down20200821162630(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(jupyterLabTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		UID:      uid, | ||||
| 		Name:     jupyterLabTemplateName, | ||||
| 		Manifest: jupyterWorkspaceTemplate, | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										251
									
								
								db/go/20200824095513_update_mask_rcnn.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								db/go/20200824095513_update_mask_rcnn.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,251 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const maskRCNNTemplate2 = `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 | ||||
|  | ||||
| entrypoint: main | ||||
| templates: | ||||
| - 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: main | ||||
| - 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}}' | ||||
|   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 | ||||
|   name: tensorflow | ||||
|   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` | ||||
|  | ||||
| func initialize20200824095513() { | ||||
| 	if _, ok := initializedMigrations[20200824095513]; !ok { | ||||
| 		goose.AddMigration(Up20200824095513, Down20200824095513) | ||||
| 		initializedMigrations[20200824095513] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200824095513 updates the maskrcnn workflow template | ||||
| func Up20200824095513(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200824095513]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Update maskrcnn | ||||
| 	workflowTemplate := &v1.WorkflowTemplate{ | ||||
| 		Name:     maskRCNNWorkflowTemplateName, | ||||
| 		Manifest: maskRCNNTemplate2, | ||||
| 		Labels: map[string]string{ | ||||
| 			"used-by": "cvat", | ||||
| 		}, | ||||
| 	} | ||||
| 	if err := workflowTemplate.GenerateUID(workflowTemplate.Name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.CreateWorkflowTemplateVersion(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200824095513 does nothing | ||||
| func Down20200824095513(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										281
									
								
								db/go/20200824101019_update_tf_object_detection_training.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										281
									
								
								db/go/20200824101019_update_tf_object_detection_training.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,281 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const tensorflowObjectDetectionTraining2 = `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 | ||||
| entrypoint: main | ||||
| templates: | ||||
| - 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: main | ||||
| - 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}}' | ||||
|   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 | ||||
|   name: tensorflow | ||||
|   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` | ||||
|  | ||||
| func initialize20200824101019() { | ||||
| 	if _, ok := initializedMigrations[20200824101019]; !ok { | ||||
| 		goose.AddMigration(Up20200824101019, Down20200824101019) | ||||
| 		initializedMigrations[20200824101019] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200824101019 updates the tf object detection training workflow template | ||||
| func Up20200824101019(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200824101019]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Update tfObjectDetectionTraining | ||||
| 	workflowTemplate := &v1.WorkflowTemplate{ | ||||
| 		Name:     tensorflowObjectDetectionWorkflowTemplateName, | ||||
| 		Manifest: tensorflowObjectDetectionTraining2, | ||||
| 		Labels: map[string]string{ | ||||
| 			"used-by": "cvat", | ||||
| 		}, | ||||
| 	} | ||||
| 	if err := workflowTemplate.GenerateUID(workflowTemplate.Name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, workflowTemplate, nil) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.CreateWorkflowTemplateVersion(namespace.Name, workflowTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200824101019 does nothing | ||||
| func Down20200824101019(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										206
									
								
								db/go/20200824101905_update_cvat_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								db/go/20200824101905_update_cvat_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate6 = `# 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.12.0-rc.6_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.12.0-rc.1_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 | ||||
|   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 | ||||
| routes: | ||||
| - 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 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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` | ||||
|  | ||||
| func initialize20200824101905() { | ||||
| 	if _, ok := initializedMigrations[20200824101905]; !ok { | ||||
| 		goose.AddMigration(Up20200824101905, Down20200824101905) | ||||
| 		initializedMigrations[20200824101905] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200824101905 updates the cvat workspace template | ||||
| func Up20200824101905(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200824101905]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:         uid, | ||||
| 			Name:        cvatTemplateName, | ||||
| 			Manifest:    cvatWorkspaceTemplate6, | ||||
| 			Description: "Powerful and efficient Computer Vision Annotation Tool (CVAT)", | ||||
| 		} | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, nil, workspaceTemplate) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200824101905 does nothing | ||||
| func Down20200824101905(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										206
									
								
								db/go/20200825154403_update_cvat_version.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								db/go/20200825154403_update_cvat_version.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate7 = `# 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.12.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.12.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 | ||||
|   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 | ||||
| routes: | ||||
| - 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 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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` | ||||
|  | ||||
| func initialize20200825154403() { | ||||
| 	if _, ok := initializedMigrations[20200825154403]; !ok { | ||||
| 		goose.AddMigration(Up20200825154403, Down20200825154403) | ||||
| 		initializedMigrations[20200825154403] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200825154403 runs the migration to upgrade the cvat workspace template | ||||
| func Up20200825154403(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200825154403]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:         uid, | ||||
| 			Name:        cvatTemplateName, | ||||
| 			Manifest:    cvatWorkspaceTemplate7, | ||||
| 			Description: "Powerful and efficient Computer Vision Annotation Tool (CVAT)", | ||||
| 		} | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, nil, workspaceTemplate) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200825154403 does nothing | ||||
| func Down20200825154403(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										218
									
								
								db/go/20200826185926_upgrade_cvat.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								db/go/20200826185926_upgrade_cvat.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,218 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate8 = `# 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.12.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.12.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 | ||||
|   timeout: 600s | ||||
| - match: | ||||
|   - uri: | ||||
|       prefix: / | ||||
|   route: | ||||
|   - destination: | ||||
|       port: | ||||
|         number: 80 | ||||
|   timeout: 600s | ||||
| # 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` | ||||
|  | ||||
| func initialize20200826185926() { | ||||
| 	if _, ok := initializedMigrations[20200826185926]; !ok { | ||||
| 		goose.AddMigration(Up20200826185926, Down20200826185926) | ||||
| 		initializedMigrations[20200826185926] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200826185926 runs the migration to upgrade the cvat workspace template | ||||
| func Up20200826185926(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200826185926]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:         uid, | ||||
| 			Name:        cvatTemplateName, | ||||
| 			Manifest:    cvatWorkspaceTemplate8, | ||||
| 			Description: "Powerful and efficient Computer Vision Annotation Tool (CVAT)", | ||||
| 		} | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, nil, workspaceTemplate) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200826185926 does nothing | ||||
| func Down20200826185926(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										68
									
								
								db/go/20200922103448_add_jupyter_lab_description.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								db/go/20200922103448_add_jupyter_lab_description.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| func initialize20200922103448() { | ||||
| 	if _, ok := initializedMigrations[20200922103448]; !ok { | ||||
| 		goose.AddMigration(Up20200922103448, Down20200922103448) | ||||
| 		initializedMigrations[20200922103448] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200922103448 adds a description to the jupyterlab workspace template | ||||
| func Up20200922103448(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200922103448]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(jupyterLabTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate, err := client.GetWorkspaceTemplate(namespace.Name, uid, 0) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if workspaceTemplate == nil { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Adding description | ||||
| 		workspaceTemplate.Description = "Interactive development environment for notebooks" | ||||
|  | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200922103448 does nothing | ||||
| func Down20200922103448(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										123
									
								
								db/go/20200929144301_add_vscode_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								db/go/20200929144301_add_vscode_workspace_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const vscodeWorkspaceTemplate = ` | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| const vscodeWorkspaceTemplateName = "Visual Studio Code" | ||||
|  | ||||
| func initialize20200929144301() { | ||||
| 	if _, ok := initializedMigrations[20200929144301]; !ok { | ||||
| 		goose.AddMigration(Up20200929144301, Down20200929144301) | ||||
| 		initializedMigrations[20200929144301] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200929144301 adds Visual Studio Code as a workspace template. | ||||
| func Up20200929144301(tx *sql.Tx) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200929144301]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 		Name:     vscodeWorkspaceTemplateName, | ||||
| 		Manifest: vscodeWorkspaceTemplate, | ||||
| 	} | ||||
|  | ||||
| 	// Adding description | ||||
| 	workspaceTemplate.Description = "Open source code editor" | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.CreateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200929144301 removes Visual Studio Code from workspace templates. | ||||
| func Down20200929144301(tx *sql.Tx) error { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	uid, err := uid2.GenerateUID(vscodeWorkspaceTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.ArchiveWorkspaceTemplate(namespace.Name, uid); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										148
									
								
								db/go/20200929153931_update_jupyter_lab_workspace_command.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								db/go/20200929153931_update_jupyter_lab_workspace_command.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const jupyterWorkspaceTemplate3 = ` | ||||
| # 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 | ||||
| ` | ||||
|  | ||||
| func initialize20200929153931() { | ||||
| 	if _, ok := initializedMigrations[20200929153931]; !ok { | ||||
| 		goose.AddMigration(Up20200929153931, Down20200929153931) | ||||
| 		initializedMigrations[20200929153931] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20200929153931 updates jupyterlab workspace to include the onepanel-sdk | ||||
| func Up20200929153931(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200929153931]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(jupyterLabTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.UpdateWorkspaceTemplateManifest(namespace.Name, uid, jupyterWorkspaceTemplate3); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20200929153931 removes the onepanel-sdk addition. | ||||
| func Down20200929153931(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20200929153931]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(jupyterLabTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		if _, err := client.UpdateWorkspaceTemplateManifest(namespace.Name, uid, jupyterWorkspaceTemplate2); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										216
									
								
								db/go/20201001070806_update_cvat.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								db/go/20201001070806_update_cvat.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"database/sql" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	uid2 "github.com/onepanelio/core/pkg/util/uid" | ||||
| 	"github.com/pressly/goose" | ||||
| ) | ||||
|  | ||||
| const cvatWorkspaceTemplate9 = `# 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.12.1_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.12.1_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` | ||||
|  | ||||
| func initialize20201001070806() { | ||||
| 	if _, ok := initializedMigrations[20201001070806]; !ok { | ||||
| 		goose.AddMigration(Up20201001070806, Down20201001070806) | ||||
| 		initializedMigrations[20201001070806] = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Up20201001070806 updates the cvat workspace | ||||
| func Up20201001070806(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is applied. | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.DB.Close() | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := migrationsRan[20201001070806]; ok { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	namespaces, err := client.ListOnepanelEnabledNamespaces() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := uid2.GenerateUID(cvatTemplateName, 30) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, namespace := range namespaces { | ||||
| 		workspaceTemplate := &v1.WorkspaceTemplate{ | ||||
| 			UID:         uid, | ||||
| 			Name:        cvatTemplateName, | ||||
| 			Manifest:    cvatWorkspaceTemplate9, | ||||
| 			Description: "Powerful and efficient Computer Vision Annotation Tool (CVAT)", | ||||
| 		} | ||||
| 		err = ReplaceArtifactRepositoryType(client, namespace, nil, workspaceTemplate) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err := client.UpdateWorkspaceTemplate(namespace.Name, workspaceTemplate); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Down20201001070806 does nothing | ||||
| func Down20201001070806(tx *sql.Tx) error { | ||||
| 	// This code is executed when the migration is rolled back. | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										130
									
								
								db/go/db.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								db/go/db.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | ||||
| package migration | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	sq "github.com/Masterminds/squirrel" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	v1 "github.com/onepanelio/core/pkg" | ||||
| 	"log" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // initializedMigrations is used to keep track of which migrations have been initialized. | ||||
| // if they are initialized more than once, goose panics. | ||||
| var initializedMigrations = make(map[int]bool) | ||||
|  | ||||
| // sqlRanMigrations keeps track of all the sql migrations that have been run. | ||||
| // we need to know this because in an older version some go migrations ran alongside sql. | ||||
| // So if they have already been run, we can't run them again. | ||||
| var sqlRanMigrations = make(map[uint64]bool) | ||||
|  | ||||
| // migrationHasAlreadyBeenRun returns true if the migration has already been run in sql | ||||
| // see sqlRanMigrations var | ||||
| func migrationHasAlreadyBeenRun(version int) bool { | ||||
| 	_, ok := sqlRanMigrations[uint64(version)] | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| // Initialize sets up the go migrations. | ||||
| func Initialize() { | ||||
| 	client, err := getClient() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("unable to get client for go migrations: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	migrationsRan, err := getRanSQLMigrations(client) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Unable to get already run sql migrations: %v", err) | ||||
| 	} | ||||
| 	sqlRanMigrations = migrationsRan | ||||
|  | ||||
| 	initialize20200525160514() | ||||
| 	initialize20200528140124() | ||||
| 	initialize20200605090509() | ||||
| 	initialize20200605090535() | ||||
| 	initialize20200626113635() | ||||
| 	initialize20200704151301() | ||||
| 	initialize20200724220450() | ||||
| 	initialize20200727144157() | ||||
| 	initialize20200728190804() | ||||
| 	initialize20200812104328() | ||||
| 	initialize20200812113316() | ||||
| 	initialize20200814160856() | ||||
| 	initialize20200821162630() | ||||
| 	initialize20200824095513() | ||||
| 	initialize20200824101019() | ||||
| 	initialize20200824101905() | ||||
| 	initialize20200825154403() | ||||
| 	initialize20200826185926() | ||||
| 	initialize20200922103448() | ||||
| 	initialize20200929144301() | ||||
| 	initialize20200929153931() | ||||
| 	initialize20201001070806() | ||||
|  | ||||
| 	if err := client.DB.Close(); err != nil { | ||||
| 		log.Printf("[error] closing db %v", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func getClient() (*v1.Client, error) { | ||||
| 	kubeConfig := v1.NewConfig() | ||||
| 	client, err := v1.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 = v1.NewDB(sqlx.MustConnect(dbDriverName, dbDataSourceName)) | ||||
|  | ||||
| 	return client, nil | ||||
| } | ||||
|  | ||||
| // getRanSQLMigrations returns a map where each key is a sql migration version ran. | ||||
| func getRanSQLMigrations(client *v1.Client) (map[uint64]bool, error) { | ||||
| 	sb := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) | ||||
|  | ||||
| 	query := sb.Select("version_id"). | ||||
| 		From("goose_db_version") | ||||
|  | ||||
| 	versions := make([]uint64, 0) | ||||
| 	if err := client.Selectx(&versions, query); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	result := make(map[uint64]bool) | ||||
| 	for _, version := range versions { | ||||
| 		result[version] = true | ||||
| 	} | ||||
|  | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| // ReplaceArtifactRepositoryType will look for {{.ArtifactRepositoryType}} in the migration and replace it based on config. | ||||
| func ReplaceArtifactRepositoryType(client *v1.Client, namespace *v1.Namespace, workflowTemplate *v1.WorkflowTemplate, workspaceTemplate *v1.WorkspaceTemplate) error { | ||||
| 	artifactRepositoryType := "s3" | ||||
| 	nsConfig, err := client.GetNamespaceConfig(namespace.Name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if nsConfig.ArtifactRepository.GCS != nil { | ||||
| 		artifactRepositoryType = "gcs" | ||||
| 	} | ||||
|  | ||||
| 	if workflowTemplate != nil { | ||||
| 		workflowTemplate.Manifest = strings.NewReplacer( | ||||
| 			"{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workflowTemplate.Manifest) | ||||
| 	} | ||||
| 	if workspaceTemplate != nil { | ||||
| 		workspaceTemplate.Manifest = strings.NewReplacer( | ||||
| 			"{{.ArtifactRepositoryType}}", artifactRepositoryType).Replace(workspaceTemplate.Manifest) | ||||
| 	} | ||||
| 	if workflowTemplate == nil && workspaceTemplate == nil { | ||||
| 		return errors.New("workflow and workspace template cannot be nil") | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
| @@ -2,7 +2,7 @@ | ||||
| CREATE TABLE workflow_template_versions | ||||
| ( | ||||
|     id                      serial PRIMARY KEY, | ||||
|     uid                     varchar(30) UNIQUE NOT NULL CHECK(uid <> ''), | ||||
|     uid                     varchar(30), | ||||
|     workflow_template_id    integer NOT NULL REFERENCES workflow_templates ON DELETE CASCADE, | ||||
|     version                 integer NOT NULL, | ||||
|     is_latest               boolean NOT NULL, | ||||
| @@ -0,0 +1,5 @@ | ||||
| -- +goose Up | ||||
| ALTER TABLE workflow_template_versions DROP COLUMN uid; | ||||
|  | ||||
| -- +goose Down | ||||
| UPDATE workflow_template_versions SET uid = version::text; | ||||
							
								
								
									
										7
									
								
								db/sql/20200617122509_remove_url_from_workspaces.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								db/sql/20200617122509_remove_url_from_workspaces.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| -- +goose Up | ||||
| ALTER TABLE workspaces DROP COLUMN url; | ||||
|  | ||||
| -- +goose Down | ||||
| ALTER TABLE workspaces ADD COLUMN url TEXT; | ||||
| UPDATE workspaces set url = ''; | ||||
| ALTER TABLE workspaces ALTER COLUMN url SET NOT NULL; | ||||
							
								
								
									
										11
									
								
								db/sql/20200630112657_update_version_types.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								db/sql/20200630112657_update_version_types.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| -- +goose Up | ||||
| -- SQL in this section is executed when the migration is applied. | ||||
| ALTER TABLE workflow_template_versions ALTER COLUMN version TYPE BIGINT; | ||||
| ALTER TABLE workspace_template_versions ALTER COLUMN version TYPE BIGINT; | ||||
| ALTER TABLE workspaces ALTER COLUMN workspace_template_version TYPE BIGINT; | ||||
|  | ||||
| -- +goose Down | ||||
| -- SQL in this section is executed when the migration is rolled back. | ||||
| ALTER TABLE workflow_template_versions ALTER COLUMN version TYPE INT; | ||||
| ALTER TABLE workspace_template_versions ALTER COLUMN version TYPE INT; | ||||
| ALTER TABLE workspaces ALTER COLUMN workspace_template_version TYPE INT; | ||||
| @@ -0,0 +1,7 @@ | ||||
| -- +goose Up | ||||
| ALTER TABLE workflow_template_versions ADD COLUMN parameters JSONB; | ||||
| UPDATE workflow_template_versions SET parameters = '[]'::JSONB; | ||||
| ALTER TABLE workflow_template_versions ALTER COLUMN parameters SET NOT NULL; | ||||
|  | ||||
| -- +goose Down | ||||
| ALTER TABLE workflow_template_versions DROP COLUMN parameters; | ||||
							
								
								
									
										195
									
								
								db/sql/20200807161614_upgrade_labels_to_jsonb.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								db/sql/20200807161614_upgrade_labels_to_jsonb.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | ||||
| -- +goose Up | ||||
| -- SQL in this section is executed when the migration is applied. | ||||
| ALTER TABLE workflow_templates ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
| ALTER TABLE workflow_template_versions ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
| ALTER TABLE workflow_executions ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
| ALTER TABLE workspaces ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
| ALTER TABLE workspace_templates ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
| ALTER TABLE workspace_template_versions ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
| ALTER TABLE cron_workflows ADD COLUMN labels JSONB DEFAULT '{}'::JSONB; | ||||
|  | ||||
| -- We take the old labels and put them into the new jsonb columns | ||||
| UPDATE workflow_templates wt | ||||
| SET labels = | ||||
|         ( | ||||
|             SELECT jsonb_object_agg(key, value) | ||||
|             FROM labels l | ||||
|             WHERE resource = 'workflow_template' | ||||
|               AND wt.id = l.resource_id | ||||
|         ) | ||||
| ; | ||||
| UPDATE workflow_templates SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| UPDATE workflow_template_versions wtv | ||||
| SET labels = | ||||
|         ( | ||||
|             SELECT jsonb_object_agg(key, value) | ||||
|             FROM labels l | ||||
|             WHERE resource = 'workflow_template_version' | ||||
|               AND wtv.id = l.resource_id | ||||
|         ) | ||||
| ; | ||||
| UPDATE workflow_template_versions SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| UPDATE workflow_executions we | ||||
| SET labels = | ||||
|     ( | ||||
|         SELECT jsonb_object_agg(key, value) | ||||
|         FROM labels l | ||||
|         WHERE resource = 'workflow_execution' | ||||
|           AND we.id = l.resource_id | ||||
|     ) | ||||
| ; | ||||
| UPDATE workflow_executions SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| UPDATE workspaces w | ||||
| SET labels = | ||||
|         ( | ||||
|             SELECT jsonb_object_agg(key, value) | ||||
|             FROM labels l | ||||
|             WHERE resource = 'workspace' | ||||
|               AND w.id = l.resource_id | ||||
|         ) | ||||
| ; | ||||
| UPDATE workspaces SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| UPDATE workspace_templates wt | ||||
| SET labels = | ||||
|         ( | ||||
|             SELECT jsonb_object_agg(key, value) | ||||
|             FROM labels l | ||||
|             WHERE resource = 'workspace_template' | ||||
|               AND wt.id = l.resource_id | ||||
|         ) | ||||
| ; | ||||
| UPDATE workspace_templates SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| UPDATE workspace_template_versions wtv | ||||
| SET labels = | ||||
|         ( | ||||
|             SELECT jsonb_object_agg(key, value) | ||||
|             FROM labels l | ||||
|             WHERE resource = 'workspace_template_version' | ||||
|               AND wtv.id = l.resource_id | ||||
|         ) | ||||
| ; | ||||
| UPDATE workspace_template_versions SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| UPDATE cron_workflows cw | ||||
| SET labels = | ||||
|         ( | ||||
|             SELECT jsonb_object_agg(key, value) | ||||
|             FROM labels l | ||||
|             WHERE resource = 'cron_workflow' | ||||
|               AND cw.id = l.resource_id | ||||
|         ) | ||||
| ; | ||||
| UPDATE cron_workflows SET labels = '{}'::jsonb WHERE labels IS NULL; | ||||
|  | ||||
| DROP table labels; | ||||
|  | ||||
| -- +goose Down | ||||
| -- SQL in this section is executed when the migration is rolled back. | ||||
|  | ||||
| -- We take the jsonb column labels and put them back into a separate labels table | ||||
| CREATE TABLE labels | ||||
| ( | ||||
|     id serial PRIMARY KEY, | ||||
|     key character varying(255), | ||||
|     value character varying(255), | ||||
|     resource character varying(255), | ||||
|     resource_id integer, | ||||
|     created_at timestamp without time zone NOT NULL DEFAULT timezone('utc'::text, now()) | ||||
| ); | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'cron_workflow', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM cron_workflows wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM cron_workflows wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'workflow_template_version', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM workflow_template_versions wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM workflow_template_versions wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'workspace_template', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM workspace_templates wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM workspace_templates wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'workspace', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM workspaces wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM workspaces wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'workflow_execution', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM workflow_executions wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM workflow_executions wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'workflow_template_version', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM workflow_template_versions wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM workflow_template_versions wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| INSERT INTO labels(key, value, resource, resource_id, created_at) | ||||
| SELECT key, value, 'workflow_template', id, now() | ||||
| FROM ( | ||||
|          SELECT wt1.id as id, wt1.key as key, wt2.labels->>wt1.key as value | ||||
|          FROM workflow_templates wt2 | ||||
|                   JOIN ( | ||||
|              SELECT wt.id, jsonb_object_keys(wt.labels) as key | ||||
|              FROM workflow_templates wt | ||||
|          ) wt1 on wt2.id = wt1.id | ||||
|      ) subquery | ||||
| ; | ||||
|  | ||||
| ALTER TABLE cron_workflows DROP COLUMN labels; | ||||
| ALTER TABLE workspace_template_versions DROP COLUMN labels; | ||||
| ALTER TABLE workspace_templates DROP COLUMN labels; | ||||
| ALTER TABLE workspaces DROP COLUMN labels; | ||||
| ALTER TABLE workflow_executions DROP COLUMN labels; | ||||
| ALTER TABLE workflow_template_versions DROP COLUMN labels; | ||||
| ALTER TABLE workflow_templates DROP COLUMN labels; | ||||
| @@ -0,0 +1,7 @@ | ||||
| -- +goose Up | ||||
| -- SQL in this section is executed when the migration is applied. | ||||
| ALTER TABLE workspace_templates ADD COLUMN description TEXT DEFAULT ''; | ||||
|  | ||||
| -- +goose Down | ||||
| -- SQL in this section is executed when the migration is rolled back. | ||||
| ALTER TABLE workspace_templates DROP COLUMN description; | ||||
							
								
								
									
										10
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								go.mod
									
									
									
									
									
								
							| @@ -4,6 +4,7 @@ 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/autorest/adal v0.8.2 // indirect | ||||
| 	github.com/Masterminds/squirrel v1.1.0 | ||||
| 	github.com/argoproj/argo v0.0.0-20200331233432-4d1175eb68f6 | ||||
| @@ -14,11 +15,10 @@ require ( | ||||
| 	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/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/hashicorp/go-uuid v1.0.2 | ||||
| 	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 | ||||
| 	github.com/lib/pq v1.3.0 | ||||
| @@ -30,13 +30,17 @@ require ( | ||||
| 	github.com/spf13/cobra v0.0.5 // indirect | ||||
| 	github.com/stretchr/testify v1.4.0 | ||||
| 	github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc | ||||
| 	golang.org/x/net v0.0.0-20200301022130-244492dfa37a | ||||
| 	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 | ||||
| 	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 | ||||
| 	sigs.k8s.io/yaml v1.2.0 | ||||
| ) | ||||
| ) | ||||
							
								
								
									
										23
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								go.sum
									
									
									
									
									
								
							| @@ -12,14 +12,18 @@ cloud.google.com/go v0.55.0 h1:eoz/lYxKSL4CNAiaUJ0ZfD1J3bfMYbU5B3rwM1C1EIU= | ||||
| cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= | ||||
| cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | ||||
| cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= | ||||
| cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU= | ||||
| cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= | ||||
| cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= | ||||
| cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= | ||||
| cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= | ||||
| cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= | ||||
| cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= | ||||
| cloud.google.com/go/pubsub v1.2.0 h1:Lpy6hKgdcl7a3WGSfJIFmxmcdjSpP6OmBEfcOv1Y680= | ||||
| cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= | ||||
| cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= | ||||
| cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= | ||||
| cloud.google.com/go/storage v1.6.0 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-autorest v11.1.2+incompatible h1:viZ3tV5l4gE2Sw0xrasFHytCGtzYCrT+um/rrSQ1BfA= | ||||
| @@ -31,8 +35,6 @@ github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+B | ||||
| github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= | ||||
| github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= | ||||
| github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= | ||||
| github.com/Azure/go-autorest/autorest/adal v0.8.3 h1:O1AGG9Xig71FxdX9HO5pGNyZ7TbSyHaVg+5eJO/jSGw= | ||||
| github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= | ||||
| github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= | ||||
| github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= | ||||
| github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= | ||||
| @@ -44,6 +46,7 @@ github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1Gn | ||||
| github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= | ||||
| github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= | ||||
| github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= | ||||
| 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/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= | ||||
| @@ -207,6 +210,7 @@ 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/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= | ||||
| github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | ||||
| @@ -218,6 +222,7 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ | ||||
| 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/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.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= | ||||
| @@ -237,8 +242,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xC | ||||
| 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/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= | ||||
| 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/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | ||||
| @@ -275,6 +278,7 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u | ||||
| 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/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= | ||||
| github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= | ||||
| github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| @@ -437,6 +441,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de | ||||
| 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.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||
| @@ -479,6 +484,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl | ||||
| golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | ||||
| golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= | ||||
| golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | ||||
| golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= | ||||
| golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | ||||
| golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= | ||||
| golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= | ||||
| @@ -486,6 +492,7 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG | ||||
| golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= | ||||
| golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= | ||||
| golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= | ||||
| golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= | ||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| @@ -527,6 +534,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ | ||||
| golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= | ||||
| golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| @@ -608,6 +616,7 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK | ||||
| golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-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/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= | ||||
| @@ -622,6 +631,7 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb | ||||
| google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | ||||
| google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= | ||||
| google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= | ||||
| google.golang.org/api v0.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40= | ||||
| google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| @@ -648,8 +658,6 @@ google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4 | ||||
| google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200317114155-1f3552e48f24/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200413115906-b5235f65be36 h1:j7CmVRD4Kec0+f8VuBAc2Ak2MFfXm5Q2/RxuJLL+76E= | ||||
| google.golang.org/genproto v0.0.0-20200413115906-b5235f65be36/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/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| @@ -711,11 +719,14 @@ 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-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | ||||
| gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
| honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= | ||||
| honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| istio.io/api v0.0.0-20200107183329-ed4b507c54e1 h1:q4xggEkhMn4RMRo8AJVNmMtNzy514DGiAUxRDDKPhZU= | ||||
| istio.io/api v0.0.0-20200107183329-ed4b507c54e1/go.mod h1:+cyHH83OwC0rFpwk8eXctzPNpiCAbB+r6kmMiAxxBHw= | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								img/auto-annotation.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								img/auto-annotation.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.8 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/jupyterlab.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								img/jupyterlab.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.0 MiB | 
							
								
								
									
										
											BIN
										
									
								
								img/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								img/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 75 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/pipelines.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								img/pipelines.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 657 KiB | 
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user