Skip to content

[WIP] #139 Redis & EventHub #143

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
99 changes: 42 additions & 57 deletions chaosazure/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from typing import List

from azure.mgmt.compute import ComputeManagementClient
from azure.mgmt.redis import RedisManagementClient
from azure.mgmt.eventhub import EventHubManagementClient
from azure.mgmt.rdbms.postgresql_flexibleservers import (
PostgreSQLManagementClient as PostgreSQLFlexibleManagementClient
)
Expand Down Expand Up @@ -47,18 +49,7 @@ def init_compute_management_client(
Initializes Compute management client for virtual machine,
and virtual machine scale sets resources under Azure Resource manager.
"""
secrets = load_secrets(experiment_secrets)
configuration = load_configuration(experiment_configuration)
with auth(secrets) as authentication:
base_url = secrets.get('cloud').endpoints.resource_manager
scopes = [base_url + "/.default"]
client = ComputeManagementClient(
credential=authentication,
credential_scopes=scopes,
subscription_id=configuration.get('subscription_id'),
base_url=base_url)

return client
return __azure_client_factory("ComputeManagementClient", Secrets)


def init_postgresql_flexible_management_client(
Expand All @@ -68,18 +59,7 @@ def init_postgresql_flexible_management_client(
Initializes Relational Database management client for postgresql_flexible,
resources under Azure Resource manager.
"""
secrets = load_secrets(experiment_secrets)
configuration = load_configuration(experiment_configuration)
with auth(secrets) as authentication:
base_url = secrets.get('cloud').endpoints.resource_manager
scopes = [base_url + "/.default"]
client = PostgreSQLFlexibleManagementClient(
credential=authentication,
credential_scopes=scopes,
subscription_id=configuration.get('subscription_id'),
base_url=base_url)

return client
return __azure_client_factory("PostgreSQLFlexibleManagementClient", Secrets)


def init_postgresql_management_client(
Expand All @@ -89,18 +69,7 @@ def init_postgresql_management_client(
Initializes Relational Database management client for postgresql,
resources under Azure Resource manager.
"""
secrets = load_secrets(experiment_secrets)
configuration = load_configuration(experiment_configuration)
with auth(secrets) as authentication:
base_url = secrets.get('cloud').endpoints.resource_manager
scopes = [base_url + "/.default"]
client = PostgreSQLManagementClient(
credential=authentication,
credential_scopes=scopes,
subscription_id=configuration.get('subscription_id'),
base_url=base_url)

return client
return __azure_client_factory("PostgreSQLManagementClient", Secrets)


def init_website_management_client(
Expand All @@ -110,35 +79,31 @@ def init_website_management_client(
Initializes Website management client for webapp resource under Azure
Resource manager.
"""
secrets = load_secrets(experiment_secrets)
configuration = load_configuration(experiment_configuration)
with auth(secrets) as authentication:
base_url = secrets.get('cloud').endpoints.resource_manager
scopes = [base_url + "/.default"]
client = WebSiteManagementClient(
credential=authentication,
credential_scopes=scopes,
subscription_id=configuration.get('subscription_id'),
base_url=base_url)

return client
return __azure_client_factory("WebSiteManagementClient", Secrets)


def init_resource_graph_client(
experiment_secrets: Secrets) -> ResourceGraphClient:
"""
Initializes Resource Graph client.
"""
secrets = load_secrets(experiment_secrets)
with auth(secrets) as authentication:
base_url = secrets.get('cloud').endpoints.resource_manager
scopes = [base_url + "/.default"]
client = ResourceGraphClient(
credential=authentication,
credential_scopes=scopes,
base_url=base_url)
return __azure_client_factory("ResourceGraphClient", Secrets)

return client

def init_redis_client(
experiment_secrets: Secrets) -> RedisManagementClient:
"""
Initializes Resource Graph client.
"""
return __azure_client_factory("RedisManagementClient", Secrets)


def init_eventhub_client(
experiment_secrets: Secrets) -> EventHubManagementClient:
"""
Initializes Resource Graph client.
"""
return __azure_client_factory("EventHubManagementClient", Secrets)


###############################################################################
Expand All @@ -159,4 +124,24 @@ def __load_exported_activities() -> List[DiscoveredActivities]:
activities.extend(discover_probes("chaosazure.postgresql_flexible.probes"))
activities.extend(discover_actions("chaosazure.postgresql.actions"))
activities.extend(discover_probes("chaosazure.postgresql.probes"))
activities.extend(discover_actions("chaosazure.redis.actions"))
activities.extend(discover_probes("chaosazure.redis.probes"))
activities.extend(discover_actions("chaosazure.eventhub.actions"))
activities.extend(discover_probes("chaosazure.eventhub.probes"))
return activities


def __azure_client_factory(experiment_secrets: Secrets, client_name: str) -> object:
"""
Simple factory for *Clients in azure.mgmt
"""
secrets = load_secrets(experiment_secrets)
with auth(secrets) as authentication:
base_url = secrets.get('cloud').endpoints.resource_manager
scopes = [base_url + "/.default"]
client = eval(client_name)(
credential=authentication,
credential_scopes=scopes,
base_url=base_url)

return client
11 changes: 11 additions & 0 deletions chaosazure/common/cleanse.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,17 @@ def vmss_instance(resource: dict) -> dict:
return __cleanse(cleanse, resource)


def redis(resource: dict) -> dict:
"""
Free the redis dictionary from unwanted keys listed below.
"""
cleanse = [
"properties"
]

return __cleanse(cleanse, resource)


def __cleanse(cleanse_list: [], resource: dict) -> dict:
for key in cleanse_list:
if key in resource:
Expand Down
Empty file.
Empty file added chaosazure/eventhubs/actions.py
Empty file.
3 changes: 3 additions & 0 deletions chaosazure/eventhubs/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
RES_TYPE_SRV_EH_NS = "microsoft.eventhub/namespaces"
RES_TYPE_SRV_EH_CLUSTER = "microsoft.eventhub/clusters"
RES_TYPE_SRV_EH_TS = "microsoft.timeseriesinsights/environments/eventsources"
Empty file added chaosazure/eventhubs/probes.py
Empty file.
Empty file added chaosazure/redis/__init__.py
Empty file.
71 changes: 71 additions & 0 deletions chaosazure/redis/actions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
import re

from azure.mgmt.redis import RedisManagementClient
from chaoslib.exceptions import FailedActivity
from chaoslib.types import Configuration, Secrets
from logzero import logger

from chaosazure import init_redis_client
from chaosazure.common import cleanse
from chaosazure.redis.constants import RES_TYPE_SRV_CACHE_REDIS
from chaosazure.common.resources.graph import fetch_resources

__all__ = ["reboot_redis"]

from chaosazure.vmss.records import Records


def reboot_redis(filter: str = None,
configuration: Configuration = None,
secrets: Secrets = None):
"""
reboot_redis redis

Parameters
----------
filter : str, optional
Filter the servers. If the filter is omitted all servers in
the subscription will be selected as potential chaos candidates.

Examples
--------
Some calling examples. Deep dive into the filter syntax:
https://docs.microsoft.com/en-us/azure/kusto/query/

"""
logger.debug(
"Start stop_redis: "
"configuration='{}', filter='{}'".format(configuration, filter))

servers = __fetch_redis(filter, configuration, secrets)
client = __redis__mgmt_client(secrets, configuration)
redis_records = Records()
for s in servers:
group = s['resourceGroup']
name = s['name']
logger.debug("Deleting server: {}".format(name))
client.redis.force_reboot(group, name)

redis_records.add(cleanse.redis(s))

return redis_records.output_as_dict('resources')


###############################################################################
# Private helper functions
###############################################################################
def __fetch_redis(filter, configuration, secrets) -> []:
servers = fetch_resources(filter, RES_TYPE_SRV_CACHE_REDIS, secrets, configuration)
if not servers:
logger.warning("No redis found")
raise FailedActivity("No redis found")
else:
logger.debug(
"Fetched redis: {}".format(
[s['name'] for s in servers]))
return servers


def __redis__mgmt_client(secrets, configuration):
return init_redis_client(secrets, configuration)
1 change: 1 addition & 0 deletions chaosazure/redis/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
RES_TYPE_SRV_CACHE_REDIS = "microsoft.cache/redis"
32 changes: 32 additions & 0 deletions chaosazure/redis/probes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
import re

from chaoslib.types import Configuration, Secrets
from logzero import logger

from chaosazure.redis.constants import RES_TYPE_SRV_CACHE_REDIS
from chaosazure.common.resources.graph import fetch_resources

__all__ = ["describe_redis"]


def describe_redis(filter: str = None,
configuration: Configuration = None,
secrets: Secrets = None):
"""
Describe Azure Cache for Redis.

Parameters
----------
filter : str
Filter the servers. If the filter is omitted all servers in
the subscription will be selected for the probe.
Filtering example:
'where resourceGroup=="myresourcegroup" and name="myresourcename"'
"""
logger.debug(
"Start describe_servers: configuration='{}', filter='{}'".format(
configuration, filter))

servers = fetch_resources(filter, RES_TYPE_SRV_CACHE_REDIS, secrets, configuration)
return servers
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
chaostoolkit-lib>==1.1.2
azure-mgmt-compute~=20.0
azure-mgmt-rdbms~=10.1
azure-mgmt-redis~=13.1
azure-mgmt-eventhub~=10.1
azure-mgmt-resourcegraph~=8.0
azure-mgmt-web~=3.0
azure-identity~=1.6
Expand Down