This patch fixes bug 1002 by using the async-friendly `asyncio.create_subprocess_exec` instead of `subprocess.run`.
Change-Id: Ie290e3f879ee83345c0b783116ef2f1e8982e537
Signed-off-by: Adam Israel <adam.israel@canonical.com>
(cherry picked from commit
3419aba44ae1829dab01b9eceb39a0425e8af973)
# See the License for the specific language governing permissions and
# limitations under the License.
# See the License for the specific language governing permissions and
# limitations under the License.
import concurrent
from .exceptions import NotImplemented
import concurrent
from .exceptions import NotImplemented
import juju
# from juju.bundle import BundleHandler
from juju.controller import Controller
import juju
# from juju.bundle import BundleHandler
from juju.controller import Controller
import os
# import re
# import ssl
import os
# import re
# import ssl
# from .vnf import N2VC
import uuid
# from .vnf import N2VC
import uuid
await self.login(cluster_uuid)
##
await self.login(cluster_uuid)
##
- # Get or create the model, based on the NS
+ # Get or create the model, based on the NS
# uuid.
model_name = db_dict["filter"]["_id"]
# uuid.
model_name = db_dict["filter"]["_id"]
cmd = [self.juju_command, "add-k8s", "--local", cloud_name]
print(cmd)
cmd = [self.juju_command, "add-k8s", "--local", cloud_name]
print(cmd)
- p = subprocess.run(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- # input=yaml.dump(credentials, Dumper=yaml.Dumper).encode("utf-8"),
- input=credentials.encode("utf-8"),
- # encoding='ascii'
+
+ process = await asyncio.create_subprocess_exec(
+ *cmd,
+ stdout=asyncio.subprocess.PIPE,
+ stderr=asyncio.subprocess.PIPE,
+ stdin=asyncio.subprocess.PIPE,
- retcode = p.returncode
- print("add-k8s return code: {}".format(retcode))
- if retcode > 0:
- raise Exception(p.stderr)
+ # Feed the process the credentials
+ process.stdin.write(credentials.encode("utf-8"))
+ await process.stdin.drain()
+ process.stdin.close()
+
+ stdout, stderr = await process.communicate()
+
+ return_code = process.returncode
+
+ print("add-k8s return code: {}".format(return_code))
+
+ if return_code > 0:
+ raise Exception(stderr)
+
return True
async def add_model(
return True
async def add_model(
cluster_uuid, cloud_name
))
cluster_uuid, cloud_name
))
- p = subprocess.run(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- # encoding='ascii'
+ process = await asyncio.create_subprocess_exec(
+ *cmd,
+ stdout=asyncio.subprocess.PIPE,
+ stderr=asyncio.subprocess.PIPE,
+ stdout, stderr = await process.communicate()
+
+ return_code = process.returncode
+
+ if return_code > 0:
- if b'already exists' not in p.stderr:
- raise Exception(p.stderr)
+ if b'already exists' not in stderr:
+ raise Exception(stderr)
- p = subprocess.run(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- # encoding='ascii'
+ process = await asyncio.create_subprocess_exec(
+ *cmd,
+ stdout=asyncio.subprocess.PIPE,
+ stderr=asyncio.subprocess.PIPE,
+ stdout, stderr = await process.communicate()
+
+ return_code = process.returncode
+
+ if return_code > 0:
- if 'already exists' not in p.stderr:
- raise Exception(p.stderr)
+ if 'already exists' not in stderr:
+ raise Exception(stderr)
# Remove the bootstrapped controller
cmd = [self.juju_command, "remove-k8s", "--client", cloud_name]
# Remove the bootstrapped controller
cmd = [self.juju_command, "remove-k8s", "--client", cloud_name]
- p = subprocess.run(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- # encoding='ascii'
+ process = await asyncio.create_subprocess_exec(
+ *cmd,
+ stdout=asyncio.subprocess.PIPE,
+ stderr=asyncio.subprocess.PIPE,
- if retcode > 0:
- raise Exception(p.stderr)
+ stdout, stderr = await process.communicate()
+
+ return_code = process.returncode
+
+ if return_code > 0:
+ raise Exception(stderr)
# Remove the cloud from the local config
cmd = [self.juju_command, "remove-cloud", "--client", cloud_name]
# Remove the cloud from the local config
cmd = [self.juju_command, "remove-cloud", "--client", cloud_name]
- p = subprocess.run(
- cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- # encoding='ascii'
+ process = await asyncio.create_subprocess_exec(
+ *cmd,
+ stdout=asyncio.subprocess.PIPE,
+ stderr=asyncio.subprocess.PIPE,
- if retcode > 0:
- raise Exception(p.stderr)
+ stdout, stderr = await process.communicate()
+
+ return_code = process.returncode
+
+ if return_code > 0:
+ raise Exception(stderr)