Skip to content

Commit

Permalink
#370 - Add get_gardens() & update_garden() (#384)
Browse files Browse the repository at this point in the history
  • Loading branch information
jlrpnbbngtn authored Feb 3, 2022
1 parent 2008bc0 commit 9ab450d
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 15 deletions.
45 changes: 37 additions & 8 deletions brewtils/rest/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,19 @@

import functools
import json
from typing import Any, List
from base64 import b64encode
from typing import Any, List

import brewtils.plugin
import requests.exceptions
import urllib3
from requests import Response, Session
from requests.utils import quote
from requests.adapters import HTTPAdapter
from yapconf import YapconfSpec

import brewtils.plugin
from brewtils.errors import _deprecate
from brewtils.rest import normalize_url_prefix
from brewtils.specification import _CONNECTION_SPEC
from requests import Response, Session
from requests.adapters import HTTPAdapter
from requests.utils import quote
from yapconf import YapconfSpec


def enable_auth(method):
Expand Down Expand Up @@ -300,6 +299,18 @@ def get_garden(self, garden_name, **kwargs):
# quote will URL encode the Garden name
return self.session.get(self.garden_url + quote(garden_name), params=kwargs)

@enable_auth
def get_gardens(self, **kwargs):
# type: (**Any) -> Response
"""Preform a GET on the Garden URL
This fetches all gardens.
Returns:
Requests Response object
"""
return self.session.get(self.garden_url, params=kwargs)

@enable_auth
def post_gardens(self, payload):
# type: (str) -> Response
Expand Down Expand Up @@ -329,6 +340,24 @@ def delete_garden(self, garden_name):
# quote will URL encode the Garden name
return self.session.delete(self.garden_url + quote(garden_name))

@enable_auth
def patch_garden(self, garden_name, payload):
# type: (str, str) -> Response
"""Perform a PATCH on a Garden URL
Args:
garden_name: Garden name
payload: Serialized patch operation
Returns:
Request Response object
"""
return self.session.patch(
self.garden_url + quote(garden_name),
data=payload,
headers=self.JSON_HEADERS,
)

@enable_auth
def get_systems(self, **kwargs):
# type: (**Any) -> Response
Expand Down Expand Up @@ -621,7 +650,7 @@ def post_jobs(self, payload):
return self.session.post(self.job_url, data=payload, headers=self.JSON_HEADERS)

def post_execute_job(self, job_id, reset_interval=False):
# type: (str) -> Response
# type: (str, bool) -> Response
"""Performs a POST on the Job Execute URL
Args:
Expand Down
26 changes: 26 additions & 0 deletions brewtils/rest/easy_client.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
import json
from base64 import b64decode
from io import BytesIO
from pathlib import Path
Expand Down Expand Up @@ -251,6 +252,15 @@ def get_garden(self, garden_name):
"""
return self.client.get_garden(garden_name)

@wrap_response(parse_method="parse_garden", parse_many=True, default_exc=FetchError)
def get_gardens(self):
"""Get all Gardens.
Returns:
A list of all the Gardens
"""
return self.client.get_gardens()

@wrap_response(parse_method="parse_garden", parse_many=False, default_exc=SaveError)
def create_garden(self, garden):
"""Create a new Garden
Expand Down Expand Up @@ -280,6 +290,22 @@ def remove_garden(self, garden_name):
"""
return self.client.delete_garden(garden_name)

@wrap_response(parse_method="parse_garden", default_exc=FetchError)
def update_garden(self, garden):
garden_as_dict = SchemaParser.serialize_garden(garden, to_string=False)

patches = json.dumps(
[
{
"operation": "config",
"path": "",
"value": garden_as_dict,
}
]
)

return self.client.patch_garden(garden.name, patches)

@wrap_response(
parse_method="parse_system", parse_many=False, default_exc=FetchError
)
Expand Down
17 changes: 14 additions & 3 deletions test/rest/client_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
import os
import warnings

import brewtils.rest
import pytest
import requests.exceptions
from brewtils.rest.client import RestClient
from mock import ANY, MagicMock, Mock
from yapconf.exceptions import YapconfItemError

import brewtils.rest
from brewtils.rest.client import RestClient


class TestRestClient(object):
@pytest.fixture
Expand Down Expand Up @@ -212,12 +211,24 @@ def test_get_garden(self, client, session_mock):
client.get_garden("name!")
session_mock.get.assert_called_with(client.garden_url + "name%21", params={})

def test_get_gardens(self, client, session_mock):
client.get_gardens()
session_mock.get.assert_called_with(client.garden_url, params={})

def test_post_garden(self, client, session_mock):
client.post_gardens(payload="payload")
session_mock.post.assert_called_with(
client.garden_url, data="payload", headers=client.JSON_HEADERS
)

def test_patch_garden(self, client, session_mock):
client.patch_garden("gardenname", "payload")
session_mock.patch.assert_called_with(
client.garden_url + "gardenname",
data="payload",
headers=client.JSON_HEADERS,
)

def test_delete_garden(self, client, session_mock):
client.delete_garden("name!")
session_mock.delete.assert_called_with(client.garden_url + "name%21")
Expand Down
26 changes: 22 additions & 4 deletions test/rest/easy_client_test.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# -*- coding: utf-8 -*-

import copy
import warnings

import pytest
from mock import ANY, Mock
from base64 import b64encode, b64decode
from base64 import b64decode, b64encode

import brewtils.rest.easy_client
import pytest
from brewtils.errors import (
ConflictError,
DeleteError,
Expand All @@ -25,6 +24,8 @@
handle_response_failure,
)
from brewtils.schema_parser import SchemaParser
from brewtils.schemas import GardenSchema
from mock import ANY, Mock


@pytest.fixture
Expand Down Expand Up @@ -156,6 +157,23 @@ def test_not_found(
with pytest.raises(NotFoundError):
client.remove_garden(bg_garden.name)

def test_update(self, client, rest_client, bg_garden, success, parser):
rest_client.patch_garden.return_value = success
parser.parse_garden.return_value = bg_garden
parser.serialize_garden.return_value = GardenSchema().dumps(bg_garden)
updated = client.update_garden(bg_garden)

assert updated == bg_garden

def test_get_all(self, client, rest_client, bg_garden, success, parser):
child_garden = copy.deepcopy(bg_garden)
child_garden.name = "child1"
both_gardens = [bg_garden, child_garden]
rest_client.get_gardens.return_value = success
parser.parse_garden.return_value = both_gardens

assert client.get_gardens() == both_gardens


class TestSystems(object):
class TestGet(object):
Expand Down

0 comments on commit 9ab450d

Please sign in to comment.