Skip to content

Commit 4466594

Browse files
committed
Handle FileNotFoundError on current_controller()
1 parent 70dda82 commit 4466594

4 files changed

Lines changed: 36 additions & 8 deletions

File tree

juju/client/connector.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import logging
66

77
import macaroonbakery.httpbakery as httpbakery
8+
9+
from juju.client import client
810
from juju.client.connection import Connection
911
from juju.client.gocookies import GoCookieJar, go_to_py_cookie
10-
from juju.client.jujudata import FileJujuData, API_ENDPOINTS_KEY
12+
from juju.client.jujudata import API_ENDPOINTS_KEY, FileJujuData
1113
from juju.client.proxy.factory import proxy_from_config
12-
from juju.errors import JujuConnectionError, JujuError, PylibjujuProgrammingError
13-
from juju.client import client
14+
from juju.errors import (JujuConnectionError, JujuError,
15+
PylibjujuProgrammingError)
1416
from juju.version import SUPPORTED_MAJOR_VERSION, TARGET_JUJU_VERSION
1517

1618
log = logging.getLogger('connector')
@@ -113,8 +115,6 @@ async def connect_controller(self, controller_name=None, specified_facades=None)
113115
"""
114116
if not controller_name:
115117
controller_name = self.jujudata.current_controller()
116-
if not controller_name:
117-
raise JujuConnectionError('No current controller')
118118

119119
controller = self.jujudata.controllers()[controller_name]
120120
endpoints = controller[API_ENDPOINTS_KEY]

juju/client/jujudata.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
import os
77
import pathlib
88

9-
from juju.client import client as jujuclient
109
import yaml
10+
1111
from juju import tag
12+
from juju.client import client as jujuclient
1213
from juju.client.gocookies import GoCookieJar
13-
from juju.errors import JujuError, PylibjujuProgrammingError
14+
from juju.errors import (JujuControllerNotFoundError, JujuError,
15+
PylibjujuProgrammingError)
1416
from juju.utils import juju_config_dir
1517

1618
API_ENDPOINTS_KEY = 'api-endpoints'
@@ -77,7 +79,10 @@ def refresh(self):
7779

7880
def current_controller(self):
7981
'''Return the current controller name'''
80-
return self._load_yaml('controllers.yaml', 'current-controller')
82+
try:
83+
return self._load_yaml('controllers.yaml', 'current-controller')
84+
except FileNotFoundError:
85+
raise JujuControllerNotFoundError('No controllers.yaml file found. python-libjuju requires a bootstrapped Juju controller.')
8186

8287
def current_model(self, controller_name=None, model_only=False):
8388
'''Return the current model, qualified by its controller name.

juju/errors.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ class JujuModelConfigError(JujuConfigError):
123123
pass
124124

125125

126+
class JujuControllerNotFoundError(JujuError):
127+
pass
128+
129+
126130
class AbstractMethodError(Exception):
127131
pass
128132

tests/unit/test_jujudata.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright 2023 Canonical Ltd.
2+
# Licensed under the Apache V2, see LICENCE file for details.
3+
4+
import unittest
5+
6+
import mock
7+
import pytest
8+
9+
from juju.client.jujudata import FileJujuData
10+
from juju.errors import JujuControllerNotFoundError
11+
12+
13+
class TestJujuData(unittest.IsolatedAsyncioTestCase):
14+
@mock.patch("io.open")
15+
async def test_verify_controller_uninitialized(self, mock_io_open):
16+
mock_io_open.side_effect = FileNotFoundError()
17+
jujudata = FileJujuData()
18+
with pytest.raises(JujuControllerNotFoundError):
19+
jujudata.current_controller()

0 commit comments

Comments
 (0)