Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/e2e-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ jobs:
steps:
- name: Notify Slack
id: main_message
uses: slackapi/slack-github-action@v2.1.0
uses: slackapi/slack-github-action@v2.1.1
with:
method: chat.postMessage
token: ${{ secrets.SLACK_BOT_TOKEN }}
Expand Down Expand Up @@ -264,7 +264,7 @@ jobs:
- name: Test summary thread
if: success()
uses: slackapi/slack-github-action@v2.1.0
uses: slackapi/slack-github-action@v2.1.1
with:
method: chat.postMessage
token: ${{ secrets.SLACK_BOT_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/nightly-smoke-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:

- name: Notify Slack
if: always() && github.repository == 'linode/linode_api4-python'
uses: slackapi/slack-github-action@v2.1.0
uses: slackapi/slack-github-action@v2.1.1
with:
method: chat.postMessage
token: ${{ secrets.SLACK_BOT_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-notify-slack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
steps:
- name: Notify Slack - Main Message
id: main_message
uses: slackapi/slack-github-action@v2.1.0
uses: slackapi/slack-github-action@v2.1.1
with:
method: chat.postMessage
token: ${{ secrets.SLACK_BOT_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ lint: build
# TEST_CASE: Optional, specify a test case (e.g. 'test_image_replication')
# TEST_ARGS: Optional, additional arguments for pytest (e.g. '-v' for verbose mode)

TEST_COMMAND = $(if $(TEST_SUITE),$(if $(filter $(TEST_SUITE),linode_client login_client),$(TEST_SUITE),models/$(TEST_SUITE)))
TEST_COMMAND = $(if $(TEST_SUITE),$(if $(filter $(TEST_SUITE),linode_client login_client filters),$(TEST_SUITE),models/$(TEST_SUITE)))

.PHONY: test-int
test-int:
Expand Down
18 changes: 7 additions & 11 deletions linode_api4/groups/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,32 +62,28 @@ def dashboards(
)

def services(
self, *filters, service_type: Optional[str] = None
) -> list[MonitorService]:
self,
*filters,
) -> PaginatedList:
"""
Lists services supported by ACLP.
supported_services = client.monitor.services()
service_details = client.monitor.services(service_type="dbaas")
service_details = client.monitor.load(MonitorService, "dbaas")

.. note:: This endpoint is in beta. This will only function if base_url is set to `https://api.linode.com/v4beta`.

API Documentation: https://techdocs.akamai.com/linode-api/reference/get-monitor-services
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-monitor-services-for-service-type

:param service_type: The service type to get details for.
:type service_type: Optional[str]
:param filters: Any number of filters to apply to this query.
See :doc:`Filtering Collections</linode_api4/objects/filtering>`
for more details on filtering.

:returns: Lists monitor services by a given service_type
:returns: Lists monitor services
:rtype: PaginatedList of the Services
"""
endpoint = (
f"/monitor/services/{service_type}"
if service_type
else "/monitor/services"
)
endpoint = "/monitor/services"

return self.client._get_and_filter(
MonitorService,
*filters,
Expand Down
11 changes: 7 additions & 4 deletions linode_api4/objects/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,16 +157,19 @@ class MonitorDashboard(Base):
}


@dataclass
class MonitorService(JSONObject):
class MonitorService(Base):
"""
Represents a single service type.
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-monitor-services

"""

service_type: ServiceType = ""
label: str = ""
api_endpoint = "/monitor/services/{service_type}"
id_attribute = "service_type"
properties = {
"service_type": Property(ServiceType),
"label": Property(),
}


@dataclass
Expand Down
24 changes: 14 additions & 10 deletions test/fixtures/monitor_services_dbaas.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
{
"data": [
{
"label": "Databases",
"service_type": "dbaas"
}
],
"page": 1,
"pages": 1,
"results": 1
}
"service_type": "dbaas",
"label": "Databases",
"alert": {
"polling_interval_seconds": [
300
],
"evaluation_period_seconds": [
300
],
"scope": [
"entity"
]
}
}
39 changes: 39 additions & 0 deletions test/integration/filters/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from test.integration.conftest import get_region
from test.integration.helpers import get_test_label

import pytest


@pytest.fixture(scope="package")
def domain_instance(test_linode_client):
client = test_linode_client

domain_addr = get_test_label(5) + "-example.com"
soa_email = "dx-test-email@linode.com"

domain = client.domain_create(domain=domain_addr, soa_email=soa_email)

yield domain

domain.delete()


@pytest.fixture(scope="package")
def lke_cluster_instance(test_linode_client):
node_type = test_linode_client.linode.types()[1] # g6-standard-1
version = test_linode_client.lke.versions()[0]

region = get_region(
test_linode_client, {"Kubernetes", "LA Disk Encryption"}
)

node_pools = test_linode_client.lke.node_pool(node_type, 3)
label = get_test_label() + "_cluster"

cluster = test_linode_client.lke.cluster_create(
region, label, node_pools, version
)

yield cluster

cluster.delete()
84 changes: 84 additions & 0 deletions test/integration/filters/model_filters_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
from test.integration.filters.fixtures import ( # noqa: F401
domain_instance,
lke_cluster_instance,
)

from linode_api4.objects import (
DatabaseEngine,
DatabaseType,
Domain,
Firewall,
Image,
LKECluster,
Type,
)


def test_database_type_model_filter(test_linode_client):
client = test_linode_client

db_disk = client.database.types()[0].disk

filtered_db_type = client.database.types(DatabaseType.disk == db_disk)

assert db_disk == filtered_db_type[0].disk


def test_database_engine_model_filter(test_linode_client):
client = test_linode_client

engine = "mysql"

filtered_db_engine = client.database.engines(
DatabaseEngine.engine == engine
)

assert len(client.database.engines()) > len(filtered_db_engine)


def test_domain_model_filter(test_linode_client, domain_instance):
client = test_linode_client

filtered_domain = client.domains(Domain.domain == domain_instance.domain)

assert domain_instance.id == filtered_domain[0].id


def test_image_model_filter(test_linode_client):
client = test_linode_client

filtered_images = client.images(Image.label.contains("Debian"))

assert len(client.images()) > len(filtered_images)


def test_linode_type_model_filter(test_linode_client):
client = test_linode_client

filtered_types = client.linode.types(Type.label.contains("Linode"))

assert len(filtered_types) > 0
assert "Linode" in filtered_types[0].label


def test_lke_cluster_model_filter(test_linode_client, lke_cluster_instance):
client = test_linode_client

filtered_cluster = client.lke.clusters(
LKECluster.label.contains(lke_cluster_instance.label)
)

assert filtered_cluster[0].id == lke_cluster_instance.id


def test_networking_firewall_model_filter(
test_linode_client, e2e_test_firewall
):
client = test_linode_client

filtered_firewall = client.networking.firewalls(
Firewall.label.contains(e2e_test_firewall.label)
)

assert len(filtered_firewall) > 0
assert e2e_test_firewall.label in filtered_firewall[0].label
8 changes: 3 additions & 5 deletions test/integration/models/monitor/test_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,9 @@ def test_get_supported_services(test_linode_client):
get_supported_service = supported_services[0].service_type

# Get details for a particular service
service_details = client.monitor.services(
service_type=get_supported_service
)
assert isinstance(service_details[0], MonitorService)
assert service_details[0].service_type == get_supported_service
service_details = client.load(MonitorService, get_supported_service)
assert isinstance(service_details, MonitorService)
assert service_details.service_type == get_supported_service

# Get Metric definition details for that particular service
metric_definitions = client.monitor.metric_definitions(
Expand Down
8 changes: 4 additions & 4 deletions test/unit/objects/monitor_test.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import datetime
from test.unit.base import ClientBaseCase

from linode_api4.objects import MonitorDashboard
from linode_api4.objects import MonitorDashboard, MonitorService


class MonitorTest(ClientBaseCase):
Expand Down Expand Up @@ -85,9 +85,9 @@ def test_get_all_dashboards(self):
self.assertEqual(dashboards[0].widgets[0].y_label, "cpu_usage")

def test_specific_service_details(self):
data = self.client.monitor.services(service_type="dbaas")
self.assertEqual(data[0].label, "Databases")
self.assertEqual(data[0].service_type, "dbaas")
data = self.client.load(MonitorService, "dbaas")
self.assertEqual(data.label, "Databases")
self.assertEqual(data.service_type, "dbaas")

def test_metric_definitions(self):

Expand Down
Loading