{"id":322874,"date":"2021-05-11T09:00:27","date_gmt":"2021-05-11T09:00:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=322874"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=322874","title":{"rendered":"\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043a\u0443\u0445\u043d\u044f: \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e vCloud API \u0438 \u0441\u043a\u043e\u0440\u043e\u0432\u0430\u0440\u043a\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0435\u0451 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0431\u043b\u0430\u043a\u0430, \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u043e\u043c VMWare \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0441\u0442\u0438\u043b\u0435 unixway \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <code>vcd-cli<\/code> . \u0421\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c shell-\u0441\u043a\u0440\u0438\u043f\u0442<\/p>\n<\/li>\n<li>\n<p>\u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0430 PowerShell? \u0415\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>PowerCLI<\/code><\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Python? \u0415\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/vmware\/pyvcloud\">pyvcloud<\/a> (<code>vcd-cli<\/code> \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430 \u0435\u0451 \u0431\u0430\u0437\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 <a href=\"https:\/\/docs.vmware.com\/en\/VMware-Cloud-Director\/index.html\">VMware Cloud Director API<\/a> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u0438\u0439, \u0437\u0430\u0442\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u043f\u0443\u0442\u044c.  \u0412\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 REST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0437\u0430 \u0432\u0430\u043c\u0438!<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 API. \u041f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0437\u0430\u0442\u043e \u0441 \u0438\u0437\u044e\u043c\u0438\u043d\u043a\u043e\u0439: \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u0434\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0430\u0447\u043a\u0443 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u044b\u0441\u044f\u0447 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432!<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442. \u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Postman<\/code> \u0438\u043b\u0438 <code>curl<\/code>.<\/p>\n<blockquote>\n<p>\u0412 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0437\u043d\u0430\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c \u043e\u0431\u043b\u0430\u043a\u043e\u043c \u0447\u0435\u0440\u0435\u0437 <code>Postman<\/code><\/p>\n<p><a href=\"https:\/\/client.cloud4y.ru\/knowledgebase.php?action=displayarticle&amp;catid=19&amp;id=640\">\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a VMware Cloud Director \u0447\u0435\u0440\u0435\u0437 vCloud API<\/a><\/p>\n<p><a href=\"https:\/\/client.cloud4y.ru\/knowledgebase.php?action=displayarticle&amp;catid=19&amp;id=665\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 EDGE c \u043f\u043e\u043c\u043e\u0449\u044c\u044e vCloud API<\/a><\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/vdc-download.vmware.com\/vmwb-repository\/dcr-public\/715b0387-34d7-4568-b2d8-d11454c52d51\/944f905e-fa4e-4005-be7d-19c3cea70ffd\/vmware_cloud_director_sp_api_guide_35_0.pdf#unique_18\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 API \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0432\u0443\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<p>1. \u0423\u0437\u043d\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u0435\u0440\u0441\u0438\u0438 API \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 get-\u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"bash\">PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/versions<\/code><\/pre>\n<blockquote>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>xml<\/code>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 <code>json<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 <s>\u0432\u043e\u0434\u044b<\/s> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a<\/p>\n<p><code>-H \"Accept:application\/*+json\"<\/code><\/p>\n<\/blockquote>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/versions -H \"Accept:application\/*+json\" { \"versionInfo\" : [ {     \"version\" : \"30.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : true,     \"otherAttributes\" : { } }, {     \"version\" : \"31.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : true,     \"otherAttributes\" : { } }, {     \"version\" : \"32.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } }, {     \"version\" : \"33.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } }, {     \"version\" : \"34.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } }, {     \"version\" : \"35.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } } ], \"schemaRoot\" : \"https:\/\/vcd.cloud4y.ru\/api\/v1.5\/schema\/\", \"any\" : [ ], \"otherAttributes\" : { } } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>2. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a API. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u0441\u0435\u0441\u0441\u0438\u044f, \u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 API, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c: <code>Accept:application\/*+json;version=35.0<\/code>. \u0415\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432 base64 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430 <code>Login@vOrg:Password<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X POST https:\/\/vcd.cloud4y.ru\/api\/sessions -H \"Accept:application\/*+json;version=35.0\" -H \"Authorization:Basic TG9naW5Adk9yZzpQYXNzd29yZA==\" -I HTTP\/1.1 200 OK Server: nginx Date: Thu, 29 Apr 2021 09:09:31 GMT Content-Type: application\/vnd.vmware.vcloud.session+json;version=35.0 Content-Length: 4945 Connection: close X-VMWARE-VCLOUD-REQUEST-ID: 58156abf-9f16-4082-9c42-f7f1e612be0c X-VMWARE-VCLOUD-ACCESS-TOKEN: eugXbGciOiJSUzI1NiJ9.euJzdWIiOigXZG1pbmlzdHgXdG9yIiwiaXNzIjoiZTE5N2QwZGMtYTA1Ny00YgXlLTlkZTUtMDZlMzQxMDQ4YjgzQDlhNjI1YWUzLWJjNDEtNDc5ZS1hZWY3LTIwMDI3ODM1Yzg3ZiIsImV4cCI6MTYxOTc3MzcxMSwidmVyc2lvbiI6InZjbG91ZF8xLjAiLCJqdGkiOiJlNnFNnzBhYWU4ZTY0OWJiYNn0YTBiYjY1ODA1NjgwMSJ9.EGFg_MYPkEPOHUW-k7Dh5sg0h8BrVces3e_q7iiLZ5G8t6D3RhGb1g921qipLuHWksrSYXJxxU18icpyiUNI_uwFqz88BrCaaVag-LVsrpxRWVe3COyKDl9xBw45bmuhr1ZGRIwQr8B495fDhhaILg7yB7-PlRSTKYhn2Ratew6mdDjq57ddqg_p7oIqezkuZZQ3L-On3OHCELKhqqFZ6GzescPFii22NC9_0hh_hJvmoewgXo-S1o2E-2qY--muRJm2EWOn2wIdQg_hZtA7WjKggbQNGvWSyjL9AUTz6At-2lHuZXJoORpMt5I-9Jo9NOPPx8RVgfa8cg7O8qy8Gw X-VMWARE-VCLOUD-TOKEN-TYPE: Bearer x-vcloud-authorization: e2fa30aae8e649bbbc4a0bb658056801 X-VMWARE-VCLOUD-REQUEST-EXECUTION-TIME: 227 Cache-Control: no-store, must-revalidate Vary: Accept-Encoding, User-Agent Strict-Transport-Security: max-age=31536000 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u043a\u0435\u043d\u044b:<\/p>\n<ol>\n<li>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c <code>x-vcloud-authorization <\/code><\/p>\n<pre><code class=\"powershell\">PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432 \"\u0431\u043e\u0435\u0432\u044b\u0445\" \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u0442.\u043a. \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 API<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u044b <code>X-VMWARE-VCLOUD-ACCESS-TOKEN<\/code> \u0438 <code>X-VMWARE-VCLOUD-TOKEN-TYPE<\/code>  <\/p>\n<pre><code>PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway -H \"Accept:application\/*+json;version=35.0\" -H \"Authorization:Bearer eugXbGciOiJSUzI1NiJ9...9Jo9NOPPx8RVgfa8cg7O8qy8Gw\" \u042d\u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0437\u0430\u0434\u0430\u0447\u043a\u0430\u043c.<\/p>\n<h3>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435: &#8216;Edge Health Check&#8217;<\/h3>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 Edge \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 <code>normal<\/code> \u0432 Web UI vCloud Director. \u041b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 <code>critical<\/code> (Web UI) \/ <code>UNREACHABLE<\/code> (API) \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0422\u0430\u043a\u043e\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0439, \u0442.\u043a. \u043e\u0442 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e, \u0435\u0441\u043b\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0436\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0440\u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0437\u0430\u043c\u0438 NSX \u0438 vCenter. \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0448\u0435: \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 <code>Redeploy<\/code> \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0435\u0431-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0445 API-\u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"169\" width=\"169\">\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 Web UI<\/p>\n<\/th>\n<th data-colwidth=\"343\" width=\"343\">\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 API<\/p>\n<\/th>\n<th>\n<p>\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>normal<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>READYREALIZED<\/code> <\/p>\n<\/td>\n<td>\n<p>\u041d\u0415\u0422<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>warning<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>FAILED_CREATIONFAILED_UNDEPLOYMENTFAILED_REDEPLOYMENT<\/code> <\/p>\n<\/td>\n<td>\n<p>\u0414\u0410<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>critical<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>NOT_READYUNREACHABLEUNKNOWNERRORREALIZATION_FAILEDundefined<\/code> <\/p>\n<\/td>\n<td>\n<p>\u0414\u0410<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>busy<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>CONFIGURINGPENDING<\/code> <\/p>\n<\/td>\n<td>\n<p>\u0414\u0410<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e API \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/h4>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 500 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u2014 \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0422\u0435\u0440\u043f\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443, \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043a\u0430\u043a \u0432 Web UI. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0445\u0438\u0442\u0440\u0438\u0442\u044c \u0438 \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430!<\/p>\n<p><code>GET https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway<\/code> <\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 (<a href=\"https:\/\/vdc-download.vmware.com\/vmwb-repository\/dcr-public\/715b0387-34d7-4568-b2d8-d11454c52d51\/944f905e-fa4e-4005-be7d-19c3cea70ffd\/vmware_cloud_director_sp_api_guide_35_0.pdf#unique_45\">Query Service<\/a>) \u0438 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X GET \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\" -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" {   \"otherAttributes\" : { },   \"link\" : [ {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=references&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.references+xml\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   }, {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=references&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.references+json\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   }, {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=idrecords&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.idrecords+xml\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   }, {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=idrecords&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.idrecords+json\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   } ],   \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=records&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",   \"type\" : \"application\/vnd.vmware.vcloud.query.records+json\",   \"name\" : \"edgeGateway\",   \"page\" : 1,   \"pageSize\" : 25,   \"total\" : 2,   \"record\" : [ {     \"_type\" : \"QueryResultEdgeGatewayRecordType\",     \"link\" : [ ],     \"metadata\" : null,     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/admin\/edgeGateway\/62e4464a-905c-4dbc-adab-2504545d9ba6\",     \"id\" : null,     \"type\" : null,     \"otherAttributes\" : {       \"task\" : \"https:\/\/vcd.cloud4y.ru\/api\/task\/7b950b14-8b49-4871-a2db-640fae971c0f\",       \"isSyslogServerSettingInSync\" : \"true\",       \"taskOperation\" : \"nsxProxyResourceConfigureServices\",       \"taskStatus\" : \"success\",       \"taskDetails\" : \" \"     },     \"advancedNetworkingEnabled\" : true,     \"availableNetCount\" : 8,     \"distributedRoutingEnabled\" : false,     \"edgeGatewayType\" : \"NSXV_BACKED\",     \"egressPointId\" : null,     \"gatewayStatus\" : \"UNREACHABLE\",     \"haStatus\" : \"DISABLED\",     \"isBusy\" : false,     \"name\" : \"mihailovgpuwin2019test2_EDGE\",     \"numberOfExtNetworks\" : 1,     \"numberOfOrgNetworks\" : 1,     \"orgName\" : \"mihailovgpuwin2019test2\",     \"orgVdcName\" : \"mihailovgpuwin2019test2_VDC_hk41gpu\",     \"vdc\" : \"https:\/\/vcd.cloud4y.ru\/api\/vdc\/09fe3b51-c908-4e9a-a4b8-36d69a7853b8\",     \"vdcGroupId\" : null,     \"vdcGroupName\" : null   }, {     \"_type\" : \"QueryResultEdgeGatewayRecordType\",     \"link\" : [ ],     \"metadata\" : null,     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/admin\/edgeGateway\/6942a0bc-7569-49da-9581-203a402386d8\",     \"id\" : null,     \"type\" : null,     \"otherAttributes\" : {       \"task\" : \"https:\/\/vcd.cloud4y.ru\/api\/task\/313b3dcc-0cf0-42ac-858d-fcea13d49ed2\",       \"isSyslogServerSettingInSync\" : \"true\",       \"taskOperation\" : \"networkEdgeGatewayCreate\",       \"taskStatus\" : \"success\",       \"taskDetails\" : \" \"     },     \"advancedNetworkingEnabled\" : true,     \"availableNetCount\" : 9,     \"distributedRoutingEnabled\" : false,     \"edgeGatewayType\" : \"NSXV_BACKED\",     \"egressPointId\" : null,     \"gatewayStatus\" : \"UNREACHABLE\",     \"haStatus\" : \"DISABLED\",     \"isBusy\" : false,     \"name\" : \"mihailov-edge-health-check-demo\",     \"numberOfExtNetworks\" : 1,     \"numberOfOrgNetworks\" : 0,     \"orgName\" : \"mihailov-vorg\",     \"orgVdcName\" : \"mihailov-vdc_HM14\",     \"vdc\" : \"https:\/\/vcd.cloud4y.ru\/api\/vdc\/6f5c8aaf-b5e0-4317-940b-cf22b6019229\",     \"vdcGroupId\" : null,     \"vdcGroupName\" : null   } ],   \"vCloudExtension\" : [ ] } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0436\u0434\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 <code>link<\/code>.<\/p>\n<p>\u042d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u0437\u0430\u043f\u0438\u0441\u0438), \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0438\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c:<\/p>\n<pre><code class=\"bash\">\"page\" : 1,         \/\/ \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043e\u0442\u0432\u0435\u0442\u0430) \"pageSize\" : 25,    \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u043e\u0442\u0432\u0435\u0442 \"total\" : 2,        \/\/ \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/code><\/pre>\n<p>\u0410 \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430:<\/p>\n<pre><code class=\"bash\">\"record\": [         \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439     {         ...         \"gatewayStatus\" : \"UNREACHABLE\",            \/\/ \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c         \"name\" : \"mihailov-edge-health-check-demo\", \/\/ \u0438\u043c\u0435\u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439         \"orgName\" : \"mihailov-vorg\",                \/\/ \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b: \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438         \"orgVdcName\" : \"mihailov-vdc_HM14\",         \/\/ \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430         ...     } ]<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (\u043e\u043d\u0438 \u0432\u0435\u0434\u044c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438), \u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430: Python3 + \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 requests.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u0447\u0435\u0433\u043e, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043e\u043b\u0435\u0431\u043b\u0435\u0442\u0441\u044f \u043e\u0442 0 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0442\u0443\u043a \u0438 \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u0451\u043c. \u0415\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0442\u0435\u043d, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>\"pageSize\" : 128<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430 \u0434\u0432\u0430-\u0442\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<h3>\u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u0435: &#8216;Disk Provisioning vs Storage Profile&#8217;<\/h3>\n<p>\u041d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0438\u0441\u043a\u043e\u0432 \u0412\u041c \u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044f\u043c\u0438 \u0421\u0425\u0414.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438: \u043e\u0434\u043d\u0430 \u0412\u041c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0448\u0430\u0440\u044b \u0438 \u0434\u043b\u044f \u043d\u0435\u0451 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430 \u0443\u043b\u044c\u0442\u0440\u0430\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0446\u0435\u043d\u043e\u0439.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430 \u043f\u043e\u0434 \u0444\u0430\u0439\u043b\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0412\u041c:<\/p>\n<ul>\n<li>\n<p>Thin Provisioning. &#171;\u0422\u043e\u043d\u043a\u0438\u0435&#187; \u0434\u0438\u0441\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0442.\u043a. \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u043e\u0432\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u0442\u0430, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0433\u043e\u0441\u0442\u0435\u0432\u0430\u044f \u041e\u0421. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0412\u041c \u0432\u044b \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043b\u0438 200 \u0413\u0411, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 50 \u0413\u0411, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u0439\u043b \u0434\u0438\u0441\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e 50 \u0438\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 200 \u0413\u0411. \u041d\u043e \u0437\u0430\u0442\u043e \u044d\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0441\u043a\u0430 \u0412\u041c, \u0442.\u043a. \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0438\u0441\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>Thick Provisioning. &#171;\u0422\u043e\u043b\u0441\u0442\u044b\u0435&#187; \u0434\u0438\u0441\u043a\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0438 \u043e\u043d \u043d\u0435 \u0441\u043a\u0430\u0447\u0435\u0442 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u041e\u0421, \u0437\u0430\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0445\u043e\u0434\u0443 \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0442\u043e\u043c\u0430\u0445 \u0421\u0425\u0414.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0441\u043a\u0430 \u0412\u041c, \u0435\u043c\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e &#171;\u0442\u043e\u043b\u0441\u0442\u044b\u043c&#187;. \u0412\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0434\u0438\u0441\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c &#171;\u0442\u043e\u043d\u043a\u0438\u043c\u0438&#187;, \u0430 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<h4>\u041f\u043e\u0434\u0431\u043e\u0440 \u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/h4>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435 \u0437\u0430\u043b\u0435\u0437\u0442\u044c \u0432 <a href=\"https:\/\/code.vmware.com\/apis\/1046\/vmware-cloud-director\/doc\/doc\/landing-extension_typed-queries.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f <s>\u0432\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438<\/s> \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u0443 \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API. \u0414\u0430, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<code>Query Service<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041d\u043e \u0432 \u043d\u0451\u043c \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: \u0438\u043c\u0435\u043d\u0430 \/ id VM, vOrg, vDC \u2014 \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0438 \u043f\u043e \u0434\u0438\u0441\u043a\u0430\u043c. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441\u043d\u043e, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0412\u041c, \u043d\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0431\u044b\u043b \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u0444\u0430\u0439\u043b\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c 3+ \u041c\u0411 \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u0438\u0432 120+ \u041c\u0411 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439.<\/p>\n<p><strong>\u0421\u0445\u0435\u043c\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445:<\/strong><\/p>\n<p>1. \u041e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c  <\/p>\n<pre><code class=\"powershell\">PS &gt; curl -X GET \"https:\/\/vcd.cloud4y.ru\/api\/query?type=adminVM\" -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u0442\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c:  <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">{     ...     \"name\": \"adminVM\",     \"page\": 1,     \"pageSize\": 128,     \"total\": 999,     \"record\": [         ...         {             \"_type\": \"QueryResultAdminVMRecordType\",             \"href\": \"https:\/\/vcd.cloud4y.ru\/api\/vApp\/vm-8ed1331e-23b2-43b3-a869-6d324561d188\",  \/\/ \u043f\u0440\u044f\u043c\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0412\u041c             \"containerName\": \"Ubuntu-20.04_Template\",             \"dateCreated\": \"2020-12-14T08:44:44.214Z\",             \"description\": \"\u0448\u0430\u0431\u043b\u043e\u043d \u0412\u041c\",             \"guestOs\": \"Ubuntu Linux (64-bit)\",             \"name\": \"base for template ubuntu-20.04\",             \"org\": \"https:\/\/vcd.cloud4y.ru\/api\/org\/e197b8dc-a357-4d8e-9de9-06e341348b83\",   \/\/ \u043f\u043e ID \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u043c\u044f             \"status\": \"POWERED_OFF\",             \"storageProfileName\": \"vcd-type-med\",             \"vdc\": \"https:\/\/vcd.cloud4y.ru\/api\/vdc\/6f5c8aaf-b5e0-4317-940b-cf22b6019229\",   \/\/ \u043f\u043e ID \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u043c\u044f             \"vmToolsVersion\": 11301         },         ... <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 <code>total<\/code>, \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0412\u041c, \u0438\u0445 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439.  <\/p>\n<p>2. \u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f  <\/p>\n<pre><code class=\"powershell\">PS &gt; curl -X GET \"https:\/\/vcd.cloud4y.ru\/api\/vApp\/vm-8ed1331e-23b2-43b3-a869-6d324561d188\" -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u043a\u043e\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0438\u0441\u043a\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438:  <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">{     ...     \"section\": [         {             \"_type\": \"VmSpecSectionType\",             ...             \"diskSection\": {                 \"otherAttributes\": {},                 \"diskSettings\": [                     {                         \"otherAttributes\": {},                         \"diskId\": \"2016\",                         \"sizeMb\": 10240,                         \"unitNumber\": 0,                         \"busNumber\": 1,                         \"adapterType\": \"4\",                         \"thinProvisioned\": true,    \/\/ \u0442\u0438\u043f \u0434\u0438\u0441\u043a\u0430                         \"disk\": null,                         \"storageProfile\": {                             ...                             \"name\": \"vcd-type-max\", \/\/ \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430                             \"type\": \"application\/vnd.vmware.vcloud.vdcStorageProfile+xml\",                         },                     }                 ],             },         } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>3. \u0425\u043e\u0442\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430, \u043d\u043e \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0431\u0443\u0434\u0443\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u044e\u0434\u0438 \u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 (vOrg &amp; vDC) \u0432\u043c\u0435\u0441\u0442\u043e ID-\u0441\u0441\u044b\u043b\u043e\u043a.  <\/p>\n<p>\u0412\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 <code>Query Service<\/code>, \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e &#8212; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>format=references<\/code> &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>records<\/code>.  <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X GET \"https:\/\/vcd.cloud4y.ru\/api\/query?format=references&amp;type=organization\" -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" <\/code><\/pre>\n<pre><code class=\"powershell\">{     ...     \"reference\": [         {             \"otherAttributes\": {},             \"href\": \"https:\/\/vcd.cloud4y.ru\/api\/org\/e197b8dc-a357-4d8e-9de9-06e341348b83\",             \"id\": \"urn:vcloud:org:e197b8dc-a357-4d8e-9de9-06e341348b83\",             \"name\": \"mihailov-vorg\",             \"type\": \"application\/vnd.vmware.vcloud.org+xml\",             \"vCloudExtension\": []         },         ... <\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0414\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u044b:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X GET \"https:\/\/vcd.cloud4y.ru\/api\/query?format=references&amp;type=adminOrgVdc\" -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" <\/code><\/pre>\n<pre><code class=\"powershell\">{     ...     \"reference\": [         {             \"otherAttributes\": {},             \"href\": \"https:\/\/vcd.cloud4y.ru\/api\/admin\/vdc\/6f5c8aaf-b5e0-4317-940b-cf22b6019229\",             \"id\": \"urn:vcloud:vdc:6f5c8aaf-b5e0-4317-940b-cf22b6019229\",             \"name\": \"mihailov-vdc_HM14\",             \"type\": \"application\/vnd.vmware.admin.vdc+xml\",             \"vCloudExtension\": []         },         ... <\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u041d\u0430 \u0434\u0435\u0441\u0435\u0440\u0442: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c &#171;\u0432 \u043b\u043e\u0431&#187; <\/h3>\n<h4>\u041a\u0442\u043e \u0432\u0438\u043d\u043e\u0432\u0430\u0442?<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 <code>requests<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c: \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439. \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442.\u0434. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u0446\u0438\u043a\u043b.<\/p>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441\u044b <code>Query Service<\/code> \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 API: \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e 128 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u0440\u0430\u0437 \u0432\u043c\u0435\u0441\u0442\u043e 25 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u2014 \u0438 \u0441\u043b\u0435\u0433\u043a\u0430 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041d\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439. \u0421\u0431\u043e\u0440 \u0436\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0434\u043a\u0440\u0443\u0442\u0438\u0448\u044c. \u041a\u043e\u0433\u0434\u0430 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043d\u0443\u0442 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0447\u0430\u0441\u044b, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043b\u043e\u0433\u0430, 58 \u043c\u0438\u043d\u0443\u0442.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">2021-04-02 23:16:14,063 | vam-py script     | INFO     |                  vam.py |                    main: 105 | ================================================================================ 2021-04-02 23:16:14,063 | vam-py script     | DEBUG    |                  vam.py |                    main: 106 | Namespace(auth_probe=False, check_json=False, disk_info=True, edge_info=False) 2021-04-02 23:16:14,063 | vam-py script     | DEBUG    |                  vam.py |                    main: 143 | ['disk_info'] 2021-04-02 23:16:14,063 | vam-py script     | DEBUG    |               helper.py |           update_tokens: 434 | running  ...  2021-04-03 00:14:12,828 | vam-py script     | DEBUG    |               helper.py |  write_list_to_csv_file: 463 | running 2021-04-03 00:14:12,828 | vam-py script     | DEBUG    |               helper.py |  get_current_script_dir:  23 | running 2021-04-03 00:14:12,828 | vam-py script     | DEBUG    |               helper.py |  get_current_script_dir:  32 | done 2021-04-03 00:14:12,843 | vam-py script     | DEBUG    |               helper.py |  write_list_to_csv_file: 478 | done 2021-04-03 00:14:12,844 | vam-py script     | INFO     |          helper_disk.py |                     foo:  83 | disk-status.csv report ready <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, <s>\u0438 \u0442\u0430\u043a \u0441\u043e\u0439\u0434\u0451\u0442<\/s>, \u0442\u0435\u0440\u043f\u0438\u043c\u043e. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u0432 \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0441\u0440\u043e\u0447\u043d\u0430\u044f, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0438\u043d\u0443\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e\u0447\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043a \u0443\u0442\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u2014 \u044d\u0442\u043e \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437. \u0421\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h4> \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c?<\/h4>\n<p>\u041f\u043e\u0440\u0430 \u0443\u0447\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u044e\u043a\u0430\u043c. \u0415\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c<code>requests<\/code> \u043d\u0430 <code>aiohttp<\/code> + <code>asyncio<\/code> , \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c x10 &#8212; x15 boost: \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0434\u043e 3-5 \u043c\u0438\u043d\u0443\u0442! \u041e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0442\u0430\u043b\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0430 \u0431\u043e\u043d\u0443\u0441\u043e\u043c \u2014 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0433\u0440\u0430\u0431\u043b\u0438 \u0441\u0431\u043e\u0435\u0432 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u043a\u043e\u0434.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e? \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u0442.\u0435. \u043e\u0431\u044a\u0451\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c. \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c, \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0442\u0432\u0435\u0442\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: \u043f\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0412\u041c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043f\u0430\u0447\u043a\u0443 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b. \u0421\u0431\u043e\u0439\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439  \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 (80..100 \u043c\u0441). \u042d\u0442\u043e \u0437\u0435\u043b\u044c\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 500-\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u0411\u044b\u0432\u0430\u0435\u0442 \u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0412\u041c \u0443\u0441\u043f\u0435\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0442\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 400-\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435\u043b\u044c, \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u042d\u0439\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u2014 \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0438\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0433\u043b\u0443\u043f\u043e, \u2014 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0437\u0430\u0437\u0440\u044f \u0434\u043e\u043b\u0431\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0432 \u0442.\u0447. \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.  <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\"># -*- coding: utf-8 -*-  import json import sys import aiohttp import asyncio  # my custom modules from conf import config as cfg_py from helper_log import log import helper   # \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 async def task(session, url, params=None) -&gt; dict:     \"\"\"     \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441      :type session:  aiohttp.client.ClientSession     :param session: \u0441\u0435\u0441\u0441\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441      :type url:      str     :param url:     \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430      :type params:   dict     :param params:  \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430      :return:        \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430     \"\"\"     response = {}     msg = '555 FAIL '     try:         async with session.get(url, params=params) as resp:             if 200 == resp.status:                 response = await resp.json()                 msg = f\"{resp.status}  OK  \"             else:                 response[resp.status] = (url, params)  # \u0432\u0435\u0440\u043d\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0430                 msg = f\"{resp.status} FAIL \"      except BaseException as e:         response[555] = (url, params)  # 555, \u0442.\u043a. \u0434\u0430\u043b\u0435\u0435 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u043c\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043a\u043e\u0434\u044b \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 range(400, 600)         log.critical(f\"{e}\")      finally:         log.debug(f\"{msg}{session} url {url} params {params}\")         return response   # \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 async def task_launcher(url_params, headers, delay=0) -&gt; list:     \"\"\"     \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438      :type url_params:   list     :param url_params:  \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 (url, params) - \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438                         \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430      :type headers:      dict     :param headers:     \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438: \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0432 json, \u0442\u043e\u043a\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438      :type delay:        int     :param delay:       \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430,                         \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443, \u0443\u043a\u0430\u0437\u0430\u0432 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.                         \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 conf.py -&gt; config['AIO_DELAY']      :return:            \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439: \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 (\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c\u0443, \u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u043c\u0443) \u0437\u0430\u043f\u0440\u043e\u0441\u0443     \"\"\"     response = []     try:         log.info(f\"{len(url_params)} async request(s) running\")          async with aiohttp.ClientSession(headers=headers) as session:             tasks = []             for tpl in url_params:                 url, params = tpl                 tasks.append(                     asyncio.ensure_future(                         task(session, url, params=params)                     )                 )                 await asyncio.sleep(delay)  # \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445             response = await asyncio.gather(*tasks)      except BaseException as e:         log.critical(f\"{e}\")      finally:         # # \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u0435\u043d\u044b, \u0435\u0441\u043b\u0438 \u043a\u043b\u044e\u0447\u0438 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432         # failed_tasks = [t.result() for t in tasks if t.result().keys() &amp; set(range(400, 600))]         # msg = f\"finished with {len(failed_tasks)} fails\" if len(failed_tasks) &gt; 0 else \"ok\"         # log.debug(f\"{msg}\")         return response   # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432: \u0442\u043e\u043a\u0435\u043d-\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0432 json def get_session_headers(vc) -&gt; dict:     \"\"\"     \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432: \u0442\u043e\u043a\u0435\u043d-\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0432 json      :type vc:   dict     :param vc:  \u043e\u0431\u043b\u0430\u043a\u043e \u0438\u0437 json-\u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u0441\u043c. helper.py -&gt; update_tokens()      :return:    \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0430     \"\"\"     headers = {}     try:         headers = {\"Accept\": f\"application\/*+json;version={vc['api_ver']};multisite=global\"}          # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0430\u043c         # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 JSON Web Token         if len(vc.get('X-VMWARE-VCLOUD-ACCESS-TOKEN', '')) &gt; 0 \\                 and len(vc.get('X-VMWARE-VCLOUD-TOKEN-TYPE', '')) &gt; 0:             headers['Authorization'] = f\"{vc['X-VMWARE-VCLOUD-TOKEN-TYPE']} \" \\                                        f\"{vc['X-VMWARE-VCLOUD-ACCESS-TOKEN']}\"             log.info(f\"JSON Web Token exist for {vc['url']}\")          # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 legacy \u0442\u043e\u043a\u0435\u043d\u0430         elif len(vc.get('x-vcloud-authorization', '')) &gt; 0:             headers['x-vcloud-authorization'] = f\"{vc['x-vcloud-authorization']}\"             log.info(f\"LEGACY token exist for {vc['url']}\")          # \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e vCloud`\u0430         else:             log.warning(f\"NO AUTH TOKEN, skipped {vc['url']}\")      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.debug(f\"headers {headers['Accept']} \")         return headers   # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u0438\u043a \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 def get_query_params(q_type, q_format=None, q_filter='', page=1, page_size=cfg_py['PAGE_SIZE']) -&gt; dict:     \"\"\"     \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u0438\u043a \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430      :type q_type:       str     :param q_type:      \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430: 'edgeGateway', 'adminVM', 'organization', ...      :type q_format:     str     :param q_format:    \u0444\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439: 'idrecords' | 'records' | 'references'                         # todo \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c (\u043d\u0430\u043f\u0440. \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0430\u043f\u043b\u0438\u043d\u043a\u043e\u0432): \u0435\u0441\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d,                             \u0442\u043e \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? None, '' \u0438\u043b\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430?!      :type q_filter:     str     :param q_filter:    \u0444\u0438\u043b\u044c\u0442\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432                         # todo \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0431\u043e\u0439, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f,                             \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 \u0432\u0438\u0434\u0430 'org==*demo-*'                             \u0438 \u043a\u0430\u043a \u0435\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c      :type page:         int     :param page:        \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430      :type page_size:    int     :param page_size:   \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435      :rtype:             dict     :return:            \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438     \"\"\"     params = {         'type':     q_type,         'format':   q_format or '',         'page':     page,         'pageSize': page_size,         # # 'filter': 'vdc==urn:vcloud:vdc:6f5c8aaf-b5e0-4317-940b-cf22b6019229',         # # 'filterEncoded': True,         'filter': q_filter or '',         # 'links':    'false',         # 'sortAsc':  'name',     }     log.debug(f\"type='{q_type}' format='{q_format}' filter='{q_filter}' page={page} page_size={page_size}\")     return params   # \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 def repeater(url_params, headers) -&gt; list:     \"\"\"     \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439      :type url_params:   list     :param url_params:  \u043e\u0442\u0432\u0435\u0442 \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439      :type headers:      dict     :param headers:     \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438: \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043b\u0435\u0435 \u0432 task_launcher      :return:            \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438     \"\"\"     ret = []     ws = 1  # \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (conf.py -&gt; conf['WS'])     wsl = [sys.maxsize, sys.maxsize - 1]  # 3\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 1\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430,     # \u0442\u043e\u0433\u0434\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 (wsl[-1] &lt; wsl[-2] &lt;= wsl[-3] or wsl[-1] &lt;= wsl[-2] &lt; wsl[-3]) \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u043f\u043e\u0441\u043b\u0435     # 3\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u0446\u0438\u043a\u043b\u0430, \u0435\u0441\u043b\u0438 \u043a\u043e\u043b-\u0432\u043e \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432      try:         # 1\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0430\u0447\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438         response = asyncio.run(task_launcher(url_params=url_params, headers=headers, delay=0))          fail = [r for r in response if r.keys() &amp; set(range(400, 600))]         ok_r = [r for r in response if not r.keys() &amp; set(range(400, 600))]          if len(response) != len(ok_r) + len(fail):             log.warning(f\"\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 ok vs fail: total {len(response)} != {len(ok_r) + len(fail)} \"                         f\"\u0441\u0443\u043c\u043c\u0435 ok {len(ok_r)} + fail {len(fail)}\")         ret += ok_r          # \u043f\u043e\u0432\u0442\u043e\u0440 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432\u0441\u0435\u0445 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432         wsl.append(len(fail))         # todo '\u0418 \u043a\u043e\u043b-\u0432\u043e \u0437\u0430\u0444\u0435\u0439\u043b\u0435\u043d\u043d\u044b\u0445 \u041d\u0415 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0438 3 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0446\u0438\u043a\u043b\u0430'         while len(fail) &gt; 0 and (wsl[-1] &lt; wsl[-2] &lt;= wsl[-3] or wsl[-1] &lt;= wsl[-2] &lt; wsl[-3]) and ws &lt; cfg_py['WS']:             log.warning(f\"{ws} repeat loop, delay {cfg_py['AIO_DELAY']}, previously failed {len(fail)}\")             ws += 1             # \u0434\u043e\u0441\u0442\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 [{code: (url1, params1)}, {code: (url1, params1)}, ...]             url_params = [v for r in fail for k, v in r.items()]             # \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439             response = asyncio.run(task_launcher(url_params=url_params, headers=headers, delay=cfg_py['AIO_DELAY']))             fail = [r for r in response if r.keys() &amp; set(range(400, 600))]             ret += [r for r in response if not r.keys() &amp; set(range(400, 600))]             wsl.append(len(fail))      except BaseException as e:         log.critical(f\"{e}\")      finally:         fails_chain = ' &gt; '.join([f\"{f}\" for f in wsl[2::]])         log.info(f\"{len(ret)} object(s) returned after {len(wsl[2::])} run(s), fails_chain {fails_chain}\")         return ret   # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439) \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 (\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439) def get_elements_by_key(lst, key_name) -&gt; list:     \"\"\"     \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 lst \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 key_name      :type lst:          list     :param lst:         \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432      :type key_name:     str     :param key_name:    \u0438\u043c\u044f \u0441\u0435\u043a\u0446\u0438\u0438: 'record', 'section', 'reference'      :return:            \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u0435\u043a\u0446\u0438\u0439 'record'     \"\"\"      values_lst = []      try:         for el in lst:             if el is not None and type(el) == dict:                 values_lst += el.get(key_name, [])      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.debug(f\"{len(values_lst)} {key_name}(s) extracted from {len(lst)} page(s)\")         return values_lst   # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441\u043e \u0432\u0441\u0435\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 json-\u043a\u043e\u043d\u0444\u0438\u0433\u0430 def query_objects(q_type, q_format='', extract_key='record', q_filter='', page_size=cfg_py['PAGE_SIZE']) -&gt; list:     \"\"\"     \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441\u043e \u0432\u0441\u0435\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 json-\u043a\u043e\u043d\u0444\u0438\u0433\u0430      :type q_type:       str     :param q_type:      \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430: adminVM | organization | adminOrgVdc | ...      :type q_format:     str     :param q_format:    \u0444\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445: records | idrecords | references      :type extract_key:  str     :param extract_key: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c (\u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438):                         record | reference | section      :type q_filter:     str     :param q_filter:    \u0444\u0438\u043b\u044c\u0442\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432      :type page_size:    int     :param page_size:   \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u043e\u0442\u0432\u0435\u0442      :return:            \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432     \"\"\"     all_vc_records = []      try:         log.info(f\"query type '{q_type}' format '{q_format}' extract key '{extract_key}' filter '{q_filter}' page size = {page_size}\")         # bug fix 'RuntimeError: Event loop is closed'         # \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c python 3.9 # https:\/\/github.com\/aio-libs\/aiohttp\/issues\/4324#issuecomment-805851060         # \u043b\u0438\u0431\u043e \u0434\u043b\u044f python 3.8 \u043d\u0430 OS Windows # https:\/\/github.com\/encode\/httpx\/issues\/914#issuecomment-622586610         if sys.version_info[0] == 3 and sys.version_info[1] &gt;= 8 and sys.platform.startswith('win'):             asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())          cfg_js = json.loads(helper.read_file(cfg_py['CONF_JSON']))         for vc in cfg_js['vClouds']:             pages = []  # \u0441\u044b\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u043b\u0430\u043a\u0443             url = vc['url'] + vc.get('api_query', '\/api\/query')             headers = get_session_headers(vc)  # \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u043b\u0430\u043a\u0430             params = get_query_params(q_type=q_type, q_format=q_format, q_filter=q_filter, page_size=page_size)             url_params = [(url, params)]              # \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0435\u0449\u0451 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c             resp = asyncio.run(task_launcher(url_params=url_params, headers=headers))  # \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430              # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430             failed_r = [r for r in resp if r.keys() &amp; set(range(400, 600))]             if len(resp) &gt; 0 and len(failed_r) != 0:                 log.error(f\"1st page FAILED {failed_r[0]}\")                 continue              log.info(f\"1st page OK: {resp[0]['total']} records expected\")              # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c 1\u0439 \u043e\u0442\u0432\u0435\u0442 \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u044b\u0440\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432             pages += resp              # \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c 1\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443: \u043d\u0443\u0436\u043d\u044b \u043b\u0438 \u0435\u0449\u0451 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b             page, page_size, total = resp[0]['page'], resp[0]['pageSize'], resp[0]['total']             if total &lt;= page * page_size:                 all_vc_records += get_elements_by_key(pages, key_name=extract_key)                 continue  # \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0443\u0436\u0435 \u043d\u0430 1\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 - \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b. \u043e\u0431\u043b\u0430\u043a\u0443              # \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446: \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u044b (url, params) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u0445 \u0432 repeater             url_params = []             for i in range(2, ((total \/\/ page_size + int(total % page_size != 0)) + 1)):                 params = get_query_params(q_type=q_type, q_format=q_format, q_filter=q_filter,                                           page=i, page_size=page_size)                 url_params.append((url, params))              resp = repeater(url_params=url_params, headers=headers)             pages += resp              # \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447 'record' - \u0441\u043f\u0438\u0441\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439             records = get_elements_by_key(pages, key_name=extract_key)             all_vc_records += records              # \u0432\u0430\u0436\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a ... \u0418 ... \u0442.\u043a. \u0435\u0441\u043b\u0438 resp \u043f\u0443\u0441\u0442, \u0442\u043e resp[0]['total'] \u0434\u0430\u0441\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438             # if len(pages) &gt; 0 and len(resp) &gt; 0 and len(records) == total:  # pages \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 records - \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438             if len(records) == total:  # pages \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 records - \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438                 log.info(f\"{len(records)} {extract_key}s received from {vc['url']}\")             else:                 log.warning(f\"FAIL only {len(records)} of {total} from {vc['url']}\")      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.info(f\"{len(all_vc_records)} {extract_key}s received\")         return all_vc_records   # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u044f\u043c\u044b\u0435 api-\u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 def get_objects_details(objects) -&gt; list:     \"\"\"     \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u044f\u043c\u044b\u0435 api-\u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440. \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d)      :type objects:  list     :param objects: \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043b\u044e\u0447 'href' - \u0441\u0441\u044b\u043b\u043a\u0430 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e API      :return:        \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439     \"\"\"     ret = []     vc_dict = {}      try:         log.debug(f\"{len(objects)} objects\")         cfg_js = json.loads(helper.read_file(cfg_py['CONF_JSON']))         all_headers = {vc['url']: get_session_headers(vc) for vc in cfg_js['vClouds']}         for obj in objects:             vc = [vc for vc in cfg_js['vClouds'] if vc['url'] == obj['otherAttributes']['site']]             if 0 == len(vc):                 log.warning(f\"\u043d\u0438\u0444\u0438\u0433\u0430, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0412\u041c {obj.get('name', None)}, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u043e\")                 continue              # \u0442.\u043a. \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0431\u0449\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u0442\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0438\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0438\u043a             # {'\u043e\u0431\u043b\u0430\u043a\u043e': {'\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a': '{...}', 'url_params': [(url1, params1), (url2, params2), ...]}, ...}             # \u043f\u043e \u043d\u0435\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u043b\u0430\u043a\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0432\u043e\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u044f \u043f\u0430\u0447\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430             vc = vc[0]             vc_dict[vc['url']] = vc_dict.get(vc['url'], {})             vc_dict[vc['url']]['headers'] = vc_dict[vc['url']].get('headers', all_headers[vc['url']])             vc_dict[vc['url']]['url_params'] = vc_dict[vc['url']].get('url_params', [])             vc_dict[vc['url']]['url_params'].append((obj['href'], None))          # \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u0447\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 - \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0432\u043e\u0435\u043c\u0443 \u043e\u0431\u043b\u0430\u043a\u0443         for vc, dct in vc_dict.items():             # todo \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438: \u043c\u043e\u0436\u043d\u043e \u0436\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430 :)             resp = repeater(url_params=dct['url_params'], headers=dct['headers'])             ret += resp      except BaseException as e:         log.critical(f\"{e}\")      finally:         return ret   # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 vOrg \u0438 vDC \u043f\u043e \u0438\u0445 ID \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0412\u041c def vm_join_org_vdc_names(vms, orgs, vdcs) -&gt; list:     \"\"\"     \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 vOrg \u0438 vDC \u043f\u043e \u0438\u0445 ID \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0412\u041c      :type vms:      list     :param vms:     \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 ID vOrg \u0438 vDC.                     \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 api-\u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 'https:\/\/...\/api\/query?type=adminVM&amp;format=...                     \u0433\u0434\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 format=records \u0438\u043b\u0438 format=idrecords      :type orgs:     list     :param orgs:    \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439      :type vdcs:     list     :param vdcs:    \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u0442\u0430\u0446\u0435\u043d\u0442\u0440\u043e\u0432      :return:     \"\"\"     ret = []     try:         log.debug(f\"{len(vms)} vms, {len(orgs)} orgs, {len(vdcs)} vdcs\")         ret = vms.copy()          # vm + org name         for o in orgs:             id_obj = ''             if o['id'] is not None:                 id_obj = o['id'].split(':')[-1]             elif o['href'] is not None:                 id_obj = o['href'].split(':')[-1]             for v in vms:                 if id_obj in v.get('org', ''):                     v['org_name'] = o['name']          # vm + vdc name         for d in vdcs:             id_obj = ''             if d['id'] is not None:                 id_obj = d['id'].split(':')[-1]             elif d['href'] is not None:                 id_obj = d['href'].split(':')[-1]             for v in vms:                 if id_obj in v.get('vdc', ''):                     v['vdc_name'] = d['name']      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.info(f\"{len(vms)} in -&gt; {len(ret)} out\")         return ret   # \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u0442 \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u0435\u043a\u0446\u0438\u044e \u0441 \u0434\u0438\u0441\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0412\u041c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 def get_vm_disks_section(details) -&gt; dict:     \"\"\"     \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u0442 \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u0435\u043a\u0446\u0438\u044e \u0441 \u0434\u0438\u0441\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0412\u041c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430      :type details:  list     :param details: \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043d\u0438\u0445      :return:        \u0441\u043b\u043e\u0432\u0430\u0440\u044c {vm_id1: [disk1, disk2, ...], ...}     \"\"\"     ret = {}      try:         log.debug(f\"{len(details)} details\")          # \u0438\u0437 \u0432\u0441\u0435\u0439 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c id \u0412\u041c (\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0438\u043c\u044f \u0438 \u043f\u0440\u043e\u0447.) \u0438 \u0432\u0441\u0435 \u0435\u0451 \u0434\u0438\u0441\u043a\u0438         # section -&gt; \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \"_type\": \"VmSpecSectionType\" -&gt; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 diskSection (None \u0438\u043b\u0438 [...])          sections = {d['id'].split(':')[-1]: d.get('section', {}) for d in details if d is not None}          vm_specs = {vmid: s for vmid, ss in sections.items() for s in ss                     if s is not None and s.get('_type', None) == 'VmSpecSectionType'}         disk_sections = {vmid: spec.get('diskSection', {}).get('diskSettings', []) for vmid, spec in vm_specs.items()                          if spec.get('diskSection', {}) is not None}         ret = disk_sections          # \u043a\u0430\u043a\u0438\u0435 \u0431\u044b\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043a\u0430\u043a \u0438\u0445 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c         #   1 - \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043b\u0435\u0442\u0435\u043b\u0430 \u0447\u0430\u043d\u0433\u0430 EX2, \u0435\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 vm_specs \u0438\u0437-\u0437\u0430 \"status\": \"UNRESOLVED\"         #   sections.keys() - vm_specs.keys()  # {'dd6c5f3f-dfab-47e8-a008-6f6bb8e6d624'}         #   #         #   2 - \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0441\u043a, \u043d\u043e \u0438 \u0434\u0440. \u0440\u0430\u0437\u0434\u0435\u043b\u044b (cpu, memory) == None         #   \u0432\u043e\u0442 \u043a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u0412\u041c         #   fails = {vmid for vmid, spec in vm_specs.items() if type(spec.get('diskSection', {})) != dict}         #   \u0438 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435-\u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0447\u0435\u0440\u0435\u0437 curl | Postman         #   f\"filter:{','.join([f'id=={s}' for s in fails])}\"  # \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 Postman      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.info(f\"return {len(ret)} VM(s), {sum([len(v) for k, v in ret.items()])} disk(s)\")         return ret   # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0438\u0441\u043a\u043e\u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0412\u041c \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0435\u0451 \u0434\u0438\u0441\u043a\u043e\u0432 def gather_disks_info(basics, details) -&gt; list:     \"\"\"     \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0438\u0441\u043a\u043e\u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0412\u041c \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0435\u0451 \u0434\u0438\u0441\u043a\u043e\u0432     \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0430\u043c\u0438 vOrg \/ vDC \/ VM      :type basics:   list     :param basics:  \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d      :type details:  dict     :param details: \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0434\u0438\u0441\u043a\u0430\u043c\u0438 \u0412\u041c {vm_id1: [disk1, disk2, ...], ...}      :return:        \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0438\u0441\u043a\u043e\u0432 \u0412\u041c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e \u0435\u0433\u043e vOrg \/ vDC \/ VM     \"\"\"     ret = []     thin_max, thick_not_max = 0, 0     try:         log.debug(f\"{len(basics)} VM(s) basics, {len(details)} VM(s) details\")         for vmid, disks in details.items():             obj = [vm for vm in basics if vmid in vm.get('href', '')] or [{}]             obj = obj.pop()             for disk in disks:                 # \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f thin_provisioned vs storage_profile                 if disk.get('thinProvisioned', None) \\                         and disk.get('storageProfile', {}).get('name', None) == 'vcd-type-max':                     trigger_level, thin_max = 1, thin_max + 1                  elif not disk.get('thinProvisioned', None) \\                         and disk.get('storageProfile', {}).get('name', None) != 'vcd-type-max':                     trigger_level, thick_not_max = 2, thick_not_max + 1                  else:                     trigger_level = 0                  d = {                     'org_name':         obj.get('org_name', None),                     'vdc_name':         obj.get('vdc_name', None),                     'vm_name':          obj.get('name', None),                     'disk_id':          disk.get('diskId', None),                     'size_MB':          disk.get('sizeMb', -1),                     'thin_provisioned': disk.get('thinProvisioned', None),                     'storage_profile':  disk.get('storageProfile', {}).get('name', None),                     'trigger_level':    trigger_level,                     'vm_vc_id':         obj.get('moref', None),                     'vm_vc_name':       obj.get('vmNameInVc', None),                     'vm_id':            vmid,                     # 'vm_api_url':       obj.get('href', None),                     # 'vm_vdc_url':       obj.get('vdc', None),                     # 'vm_org_url':       obj.get('org', None),                 }                  ret.append(d)                 # \u041d\u0415 \u041f\u041e\u0414\u0414\u0415\u0420\u0416\u0418\u0412\u0410\u0415\u0422\u0421\u042f \u0412 API                 #  \u0435\u0449\u0451 \u0431\u044b datastore \u0443\u0437\u043d\u0430\u0442\u044c: \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a \u0412\u041c \u0434\u0438\u0441\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 vCenter vCloud \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442                 #  datastore \u0444\u0430\u0439\u043b\u0430 \u0434\u0438\u0441\u043a\u0430, \u0430 \u043b\u0435\u043f\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u0442\u0443 storage_policy, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0443 \u0412\u041c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.                 #  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, vCloud \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0438\u0441\u043a\u0430                 #  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0430 \u0437\u0430\u0431\u044b\u043b\u0438 \u0432 Director`\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u043c\u0443 storage_policy:      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.info(f\"{len(ret)} disk(s) total, thin_max {thin_max}, thick_not_max {thick_not_max}\")         return ret   # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f Zabbix def zabbix_disks_discovery(data: list) -&gt; dict:     zbx = {'data': []}     try:         for d in data:             e = {                 # for zabbix data element prototypes                 '{#DISK_ORG}':      d.setdefault('org_name', None),                 '{#DISK_VDC}':      d.setdefault('vdc_name', None),                 '{#DISK_VM}':       d.setdefault('vm_name', None),                 '{#DISK_ID}':       d.setdefault('disk_id', None),                 '{#DISK_SIZE_MB}':  d.setdefault('size_MB', None),                 '{#DISK_IS_THIN}':  d.setdefault('thin_provisioned', None),                 '{#DISK_STORAGE}':  d.setdefault('storage_profile', None),                 '{#DISK_TRIGGER}':  d.setdefault('trigger_level', None),  # 0 - \u043e\u043a, 1 - \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u0430\u043a\u0441, 2 - \u0442\u043e\u043b\u0441\u0442\u044b\u0439 \u043d\u0435\u043c\u0430\u043a\u0441             }             zbx['data'].append(e)      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.info(f\"zabbix discovery: {len(zbx['data'])} records\")         return zbx   # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f Zabbix def zabbix_disks_data(data: list) -&gt; dict:     zbx = {'total': len(data)}     try:         for d in data:             e = {                 # for zabbix data element prototypes                 '{org_name}':           d.setdefault('org_name', None),                 '{vdc_name}':           d.setdefault('vdc_name', None),                 '{vm_name}':            d.setdefault('vm_name', None),                 '{disk_id}':            d.setdefault('disk_id', None),                 '{size_MB}':            d.setdefault('size_MB', None),                 '{thin_provisioned}':   d.setdefault('thin_provisioned', None),                 '{storage_profile}':    d.setdefault('storage_profile', None),                 '{trigger_level}':      d.setdefault('trigger_level', None),  # 0 \u043e\u043a, 1 \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u0430\u043a\u0441, 2 \u0442\u043e\u043b\u0441\u0442\u044b\u0439 \u043d\u0435\u043c\u0430\u043a\u0441                 '{vm_vc_name}':         d.setdefault('vm_vc_name', None),                 '{vm_vc_id}':           d.setdefault('vm_vc_id', None),             }             vm_id = d.get('vm_id', -1)             zbx.setdefault(vm_id, [])             zbx[vm_id].append(e)      except BaseException as e:         log.critical(f\"{e}\")      finally:         log.info(f\"zabbix data: {len([k for k, v in zbx.items() if k != 'total'])} VM(s)\"                  f\" {sum([len(v) for k, v in zbx.items() if type(v) == list])} disk(s)\")         return zbx<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0430\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">     elif args.disk_info:             log.debug(f\"{[k for k, v in args.__dict__.items() if True == v]}\")             if helper.update_tokens():                 log.info(f\"auth token ready\")                  # \u0441\u043f\u0438\u0441\u043e\u043a vOrg, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u043c\u044f vOrg \u043f\u043e \u0435\u0451 id \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 vm                 orgs = helper_disk.query_objects(q_type='organization', q_format='references', extract_key='reference')                 helper.write_list_to_csv_file(os.path.join(cfg_py['REPORT_DIR'],                                                            cfg_py['DISK_REPORT_CSV_ORG']), data=orgs)                  # \u0441\u043f\u0438\u0441\u043e\u043a vDC, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u043c\u044f vDC \u043f\u043e \u0435\u0433\u043e id \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 vm                 vdcs = helper_disk.query_objects(q_type='adminOrgVdc', q_format='references', extract_key='reference')                 helper.write_list_to_csv_file(os.path.join(cfg_py['REPORT_DIR'],                                                            cfg_py['DISK_REPORT_CSV_VDC']), data=vdcs)                  # \u0441\u043f\u0438\u0441\u043e\u043a \u0412\u041c, \u0444\u043e\u0440\u043c\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 'records' !!!                 # \u0438\u043d\u0430\u0447\u0435 \u0438\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0412\u041c \u0438\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0418\u0414 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u0432\u0414\u0426                 vms_basic = helper_disk.query_objects(q_type='adminVM', q_format='records', extract_key='record')                  # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u0435\u043d\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u0432\u0414\u0426                 vms_plus = helper_disk.vm_join_org_vdc_names(vms_basic, orgs=orgs, vdcs=vdcs)                 helper.write_list_to_csv_file(os.path.join(cfg_py['REPORT_DIR'],                                                            cfg_py['DISK_REPORT_CSV_VM']), data=vms_plus)                  # todo TEST WHILE LOOP BY FAKES VM URL                 #  vms_basic.insert(-1, vms_basic[-1].copy())                 #  vms_basic.insert(-1, vms_basic[-1].copy())                 #  vms_basic[-2]['href'] = 'https:\/\/vcdfz.cloud4y.ru\/api\/vApp\/vm-5752b712-db82-4399-ada8'                 #  vms_basic[-1]['href'] = 'https:\/\/vcdfz.cloud4y.ru\/api\/vApp\/vm-02a33721-fe5e-4606-b02a'                 vms_basic.insert(0, vms_basic[0].copy())                 vms_basic[0]['href'] = vms_basic[0]['href'] + '-------------'                  # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0412\u041c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0414\u041e\u041b\u0413\u041e!)                 vms_details = helper_disk.get_objects_details(objects=vms_basic)                 # \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c diskSection                 vms_disks = helper_disk.get_vm_disks_section(details=vms_details)                 # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 VM \/ vOrg \/ vDC                 disks = helper_disk.gather_disks_info(basics=vms_plus, details=vms_disks)                 helper.write_list_to_csv_file(os.path.join(cfg_py['REPORT_DIR'],                                                            cfg_py['DISK_REPORT_CSV_ALL']), data=disks)                  # \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b                 misconfigurations = [d for d in disks if d['trigger_level'] &gt; 0]                 helper.write_list_to_csv_file(                     os.path.join(cfg_py['REPORT_DIR'], cfg_py['DISK_REPORT_CSV_ZBX']), data=misconfigurations)                  # zabbix \u0444\u0430\u0439\u043b\u044b                 zbx_discover = helper_disk.zabbix_disks_discovery(data=misconfigurations)                 zbx_discover_result = helper.write_file(os.path.join(                     cfg_py['REPORT_DIR'], cfg_py['DISK_REPORT_ZBX_DISCOVER']), json.dumps(zbx_discover, indent=4))                  zbx_data = helper_disk.zabbix_disks_data(data=misconfigurations)                 zbx_data_result = helper.write_file(os.path.join(                     cfg_py['REPORT_DIR'], cfg_py['DISK_REPORT_ZBX_DATA']), json.dumps(zbx_data, indent=4))                  s = helper.read_file(os.path.join(cfg_py['LOG_DIR'], cfg_py['LOG_PROFILING']))                 s = f\"{s}\\n\" if len(s) &gt; 0 else ''                 s1 = f\"seconds {(time.time() - start_time): &gt;8.1f}    PAGE_SIZE {cfg_py['PAGE_SIZE']: &gt;6}\" \\                      f\"      ORGs {len(orgs): &gt;4}       vDCs {len(vdcs): &gt;4}\" \\                      f\"      VMs {len(vms_basic): &gt;6}      disks {len(disks): &gt;6}\" \\                      f\"       misconfigurations {len(misconfigurations): &gt;4}      delay {cfg_py['AIO_DELAY']: &gt;6.3f}\" \\                      f\"    {cfg_py['LOG_LEVEL']:&lt;8}    \"                 s = f\"{s}{s1}\"                  helper.write_file(os.path.join(cfg_py['LOG_DIR'], cfg_py['LOG_PROFILING']), s)                 print(s1)                  if zbx_discover_result and zbx_data_result:                     print(\"\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e\")                 else:                     print(\"\u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0437\u0430\u0431\u0431\u0438\u043a\u0441 \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b\")                  return 0 <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<hr>\n<p><strong>\u0427\u0442\u043e \u0435\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432 \u0431\u043b\u043e\u0433\u0435&nbsp;<\/strong><a href=\"https:\/\/www.cloud4y.ru\/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=article\"><strong>Cloud4Y<\/strong><\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/547164\/\">\u0427\u0430\u0441\u0442\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Nginx, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u043c<\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/541348\/\">\u041f\u0430\u0440\u043e\u043b\u044c \u043a\u0430\u043a \u043a\u0440\u0435\u0441\u0442\u0440\u0430\u0436: \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/news\/t\/556258\/\">\u0412 \u0421\u0428\u0410 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0441\u0442 \u0441\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 VPN<\/a>  <\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/542000\/\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 vApp \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b VMware vCenter + ESXi<\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/553920\/\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0430\u0448 \u0431\u0438\u0437\u043d\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d<\/a>  <\/p>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043d\u0430\u0448&nbsp;<a href=\"https:\/\/t.me\/cloud4y\">Telegram<\/a>-\u043a\u0430\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e. \u041f\u0438\u0448\u0435\u043c \u043d\u0435 \u0447\u0430\u0449\u0435 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0434\u0435\u043b\u044e \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0434\u0435\u043b\u0443.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/555722\/\"> https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/555722\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0435\u0451 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0431\u043b\u0430\u043a\u0430, \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u043e\u043c VMWare \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0441\u0442\u0438\u043b\u0435 unixway \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <code>vcd-cli<\/code> . \u0421\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c shell-\u0441\u043a\u0440\u0438\u043f\u0442<\/p>\n<\/li>\n<li>\n<p>\u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0430 PowerShell? \u0415\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>PowerCLI<\/code><\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Python? \u0415\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/vmware\/pyvcloud\">pyvcloud<\/a> (<code>vcd-cli<\/code> \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430 \u0435\u0451 \u0431\u0430\u0437\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 <a href=\"https:\/\/docs.vmware.com\/en\/VMware-Cloud-Director\/index.html\">VMware Cloud Director API<\/a> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u0438\u0439, \u0437\u0430\u0442\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u043f\u0443\u0442\u044c.  \u0412\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 REST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0437\u0430 \u0432\u0430\u043c\u0438!<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 API. \u041f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0437\u0430\u0442\u043e \u0441 \u0438\u0437\u044e\u043c\u0438\u043d\u043a\u043e\u0439: \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u0434\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0430\u0447\u043a\u0443 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u044b\u0441\u044f\u0447 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432!<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442. \u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Postman<\/code> \u0438\u043b\u0438 <code>curl<\/code>.<\/p>\n<blockquote>\n<p>\u0412 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0437\u043d\u0430\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c \u043e\u0431\u043b\u0430\u043a\u043e\u043c \u0447\u0435\u0440\u0435\u0437 <code>Postman<\/code><\/p>\n<p><a href=\"https:\/\/client.cloud4y.ru\/knowledgebase.php?action=displayarticle&amp;catid=19&amp;id=640\">\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a VMware Cloud Director \u0447\u0435\u0440\u0435\u0437 vCloud API<\/a><\/p>\n<p><a href=\"https:\/\/client.cloud4y.ru\/knowledgebase.php?action=displayarticle&amp;catid=19&amp;id=665\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 EDGE c \u043f\u043e\u043c\u043e\u0449\u044c\u044e vCloud API<\/a><\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/vdc-download.vmware.com\/vmwb-repository\/dcr-public\/715b0387-34d7-4568-b2d8-d11454c52d51\/944f905e-fa4e-4005-be7d-19c3cea70ffd\/vmware_cloud_director_sp_api_guide_35_0.pdf#unique_18\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 API \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0432\u0443\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<p>1. \u0423\u0437\u043d\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u0435\u0440\u0441\u0438\u0438 API \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 get-\u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"bash\">PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/versions<\/code><\/pre>\n<blockquote>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>xml<\/code>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 <code>json<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 <s>\u0432\u043e\u0434\u044b<\/s> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a<\/p>\n<p><code>-H \"Accept:application\/*+json\"<\/code><\/p>\n<\/blockquote>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/versions -H \"Accept:application\/*+json\" { \"versionInfo\" : [ {     \"version\" : \"30.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : true,     \"otherAttributes\" : { } }, {     \"version\" : \"31.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : true,     \"otherAttributes\" : { } }, {     \"version\" : \"32.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } }, {     \"version\" : \"33.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } }, {     \"version\" : \"34.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } }, {     \"version\" : \"35.0\",     \"loginUrl\" : \"https:\/\/vcd.cloud4y.ru\/api\/sessions\",     \"mediaTypeMapping\" : [ ],     \"any\" : [ ],     \"deprecated\" : false,     \"otherAttributes\" : { } } ], \"schemaRoot\" : \"https:\/\/vcd.cloud4y.ru\/api\/v1.5\/schema\/\", \"any\" : [ ], \"otherAttributes\" : { } } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>2. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a API. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u0441\u0435\u0441\u0441\u0438\u044f, \u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 API, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c: <code>Accept:application\/*+json;version=35.0<\/code>. \u0415\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432 base64 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430 <code>Login@vOrg:Password<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X POST https:\/\/vcd.cloud4y.ru\/api\/sessions -H \"Accept:application\/*+json;version=35.0\" -H \"Authorization:Basic TG9naW5Adk9yZzpQYXNzd29yZA==\" -I HTTP\/1.1 200 OK Server: nginx Date: Thu, 29 Apr 2021 09:09:31 GMT Content-Type: application\/vnd.vmware.vcloud.session+json;version=35.0 Content-Length: 4945 Connection: close X-VMWARE-VCLOUD-REQUEST-ID: 58156abf-9f16-4082-9c42-f7f1e612be0c X-VMWARE-VCLOUD-ACCESS-TOKEN: eugXbGciOiJSUzI1NiJ9.euJzdWIiOigXZG1pbmlzdHgXdG9yIiwiaXNzIjoiZTE5N2QwZGMtYTA1Ny00YgXlLTlkZTUtMDZlMzQxMDQ4YjgzQDlhNjI1YWUzLWJjNDEtNDc5ZS1hZWY3LTIwMDI3ODM1Yzg3ZiIsImV4cCI6MTYxOTc3MzcxMSwidmVyc2lvbiI6InZjbG91ZF8xLjAiLCJqdGkiOiJlNnFNnzBhYWU4ZTY0OWJiYNn0YTBiYjY1ODA1NjgwMSJ9.EGFg_MYPkEPOHUW-k7Dh5sg0h8BrVces3e_q7iiLZ5G8t6D3RhGb1g921qipLuHWksrSYXJxxU18icpyiUNI_uwFqz88BrCaaVag-LVsrpxRWVe3COyKDl9xBw45bmuhr1ZGRIwQr8B495fDhhaILg7yB7-PlRSTKYhn2Ratew6mdDjq57ddqg_p7oIqezkuZZQ3L-On3OHCELKhqqFZ6GzescPFii22NC9_0hh_hJvmoewgXo-S1o2E-2qY--muRJm2EWOn2wIdQg_hZtA7WjKggbQNGvWSyjL9AUTz6At-2lHuZXJoORpMt5I-9Jo9NOPPx8RVgfa8cg7O8qy8Gw X-VMWARE-VCLOUD-TOKEN-TYPE: Bearer x-vcloud-authorization: e2fa30aae8e649bbbc4a0bb658056801 X-VMWARE-VCLOUD-REQUEST-EXECUTION-TIME: 227 Cache-Control: no-store, must-revalidate Vary: Accept-Encoding, User-Agent Strict-Transport-Security: max-age=31536000 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u043a\u0435\u043d\u044b:<\/p>\n<ol>\n<li>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c <code>x-vcloud-authorization <\/code><\/p>\n<pre><code class=\"powershell\">PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432 \"\u0431\u043e\u0435\u0432\u044b\u0445\" \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u0442.\u043a. \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 API<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u044b <code>X-VMWARE-VCLOUD-ACCESS-TOKEN<\/code> \u0438 <code>X-VMWARE-VCLOUD-TOKEN-TYPE<\/code>  <\/p>\n<pre><code>PS &gt; curl -X GET https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway -H \"Accept:application\/*+json;version=35.0\" -H \"Authorization:Bearer eugXbGciOiJSUzI1NiJ9...9Jo9NOPPx8RVgfa8cg7O8qy8Gw\" \u042d\u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0437\u0430\u0434\u0430\u0447\u043a\u0430\u043c.<\/p>\n<h3>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435: &#8216;Edge Health Check&#8217;<\/h3>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 Edge \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 <code>normal<\/code> \u0432 Web UI vCloud Director. \u041b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 <code>critical<\/code> (Web UI) \/ <code>UNREACHABLE<\/code> (API) \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0422\u0430\u043a\u043e\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0439, \u0442.\u043a. \u043e\u0442 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e, \u0435\u0441\u043b\u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0436\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0440\u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0437\u0430\u043c\u0438 NSX \u0438 vCenter. \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0448\u0435: \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 <code>Redeploy<\/code> \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0435\u0431-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0445 API-\u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"169\" width=\"169\">\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 Web UI<\/p>\n<\/th>\n<th data-colwidth=\"343\" width=\"343\">\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 API<\/p>\n<\/th>\n<th>\n<p>\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>normal<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>READYREALIZED<\/code> <\/p>\n<\/td>\n<td>\n<p>\u041d\u0415\u0422<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>warning<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>FAILED_CREATIONFAILED_UNDEPLOYMENTFAILED_REDEPLOYMENT<\/code> <\/p>\n<\/td>\n<td>\n<p>\u0414\u0410<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>critical<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>NOT_READYUNREACHABLEUNKNOWNERRORREALIZATION_FAILEDundefined<\/code> <\/p>\n<\/td>\n<td>\n<p>\u0414\u0410<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"169\" width=\"169\">\n<p>busy<\/p>\n<\/td>\n<td data-colwidth=\"343\" width=\"343\">\n<p><code>CONFIGURINGPENDING<\/code> <\/p>\n<\/td>\n<td>\n<p>\u0414\u0410<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e API \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/h4>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 500 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u2014 \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0422\u0435\u0440\u043f\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443, \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043a\u0430\u043a \u0432 Web UI. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0445\u0438\u0442\u0440\u0438\u0442\u044c \u0438 \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430!<\/p>\n<p><code>GET https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway<\/code> <\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 (<a href=\"https:\/\/vdc-download.vmware.com\/vmwb-repository\/dcr-public\/715b0387-34d7-4568-b2d8-d11454c52d51\/944f905e-fa4e-4005-be7d-19c3cea70ffd\/vmware_cloud_director_sp_api_guide_35_0.pdf#unique_45\">Query Service<\/a>) \u0438 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">PS &gt; curl -X GET \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\" -H \"Accept:application\/*+json;version=35.0\" -H \"x-vcloud-authorization:e2fa30aae8e649bbbc4a0bb658056801\" {   \"otherAttributes\" : { },   \"link\" : [ {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=references&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.references+xml\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   }, {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=references&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.references+json\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   }, {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=idrecords&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.idrecords+xml\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   }, {     \"otherAttributes\" : { },     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=idrecords&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",     \"id\" : null,     \"name\" : null,     \"type\" : \"application\/vnd.vmware.vcloud.query.idrecords+json\",     \"model\" : null,     \"rel\" : \"alternate\",     \"vCloudExtension\" : [ ]   } ],   \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/query?type=edgeGateway&amp;page=1&amp;pageSize=25&amp;format=records&amp;filter=(gatewayStatus!=READY);(gatewayStatus!=REALIZED);(name==*mih*)\",   \"type\" : \"application\/vnd.vmware.vcloud.query.records+json\",   \"name\" : \"edgeGateway\",   \"page\" : 1,   \"pageSize\" : 25,   \"total\" : 2,   \"record\" : [ {     \"_type\" : \"QueryResultEdgeGatewayRecordType\",     \"link\" : [ ],     \"metadata\" : null,     \"href\" : \"https:\/\/vcd.cloud4y.ru\/api\/admin\/edgeGateway\/62e4464a-905c-4dbc-adab-2504545d9ba6\",     \"id\" : null,     \"type\" : null,     \"otherAttributes\" : {       \"task\" : \"https:\/\/vcd.cloud4y.ru\/api\/task\/7b950b14-8b49-4871-a2db-640fae971c0f\",       \"isSyslogServerSettingInSync\" <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-322874","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=322874"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322874\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}