This repository has been archived by the owner on Nov 1, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 199
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update NSGs after changes to instance config (#1385)
* Refactor set_admins into configuration.py and update deployment params with nsg_config * Fixing arguments. * Param takes in network config json * Fixing Client in deploy * removing import * Adding onefuzztypes to reqs.txt * Reverting to single list * Removing imports. * Retriggering build * Setting specific pip version for local testing. * Removing imports? * More imports. * Fixing formatting. * Updating how to parse nsg param. * Removing old logging statements. * Fixing types. * REmoving bad log * Removing local pip version. * Removing comments * fixing * Formatting * Fixing .split() * Adding NSG rule checks and type. * Formatting. * Formatting. * Removing imports. * Fixing formatting. * Testing formatting. * Retrigger? * New InstanceConfigClient class. * Retrigger. * Cherry picked commit. * Reformatting. * Actually fixing formatting. * Fixing table_service call. * Fixing return statement and nsg_rule pass. * Full config. * Removing commented out code. * Fixing logic. * Adding wildcard check. * Code for updating NSGs when instance_config updated. * Updating argument to set_allowed_rules * Updating model to no longer be optional. * Fixing args for set_allowed_rules * trying to fix calls to get_nsg * Updating calls to nsg lib * Fixing imports. * Updating calls to set_allowed and creating constructor for NSGConfig type. * Removing constructor and manually setting default ip * Fixing models. * Hopefully fixing docs. * Fix set_allowed call * Adding error handling for update config. * Changing to error check. * Fixing error call. * Fixing imports. * Adding empty() function on request. * Removing empty function. # Conflicts: # src/pytypes/onefuzztypes/models.py * Fixing files for update. * Fixing nsg.py. * Fixing imports. * removing commented code. Co-authored-by: nharper285 <nharper285@gmail.com>
- Loading branch information
1 parent
684b3d8
commit 80fe4ff
Showing
10 changed files
with
230 additions
and
82 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
#!/usr/bin/env python | ||
# | ||
# Copyright (c) Microsoft Corporation. | ||
# Licensed under the MIT License. | ||
|
||
import ipaddress | ||
import json | ||
import logging | ||
from typing import List, Optional | ||
from uuid import UUID | ||
|
||
from azure.cosmosdb.table.tableservice import TableService | ||
|
||
storage_client_logger = logging.getLogger("azure.cosmosdb.table.common.storageclient") | ||
TABLE_NAME = "InstanceConfig" | ||
|
||
logger = logging.getLogger("deploy") | ||
|
||
|
||
class InstanceConfigClient: | ||
|
||
table_service: TableService | ||
resource_group: str | ||
|
||
def __init__(self, table_service: TableService, resource_group: str): | ||
self.resource_group = resource_group | ||
self.table_service = table_service | ||
self.create_if_missing(table_service) | ||
|
||
## Disable logging from storageclient. This module displays an error message | ||
## when a resource is not found even if the exception is raised and handled internally. | ||
## This happen when a table does not exist. An error message is displayed but the exception is | ||
## handled by the library. | ||
def disable_storage_client_logging(self) -> None: | ||
if storage_client_logger: | ||
storage_client_logger.disabled = True | ||
|
||
def enable_storage_client_logging(self) -> None: | ||
if storage_client_logger: | ||
storage_client_logger.disabled = False | ||
|
||
def create_if_missing(self, table_service: TableService) -> None: | ||
try: | ||
self.disable_storage_client_logging() | ||
|
||
if not table_service.exists(TABLE_NAME): | ||
table_service.create_table(TABLE_NAME) | ||
finally: | ||
self.enable_storage_client_logging() | ||
|
||
|
||
class NsgRule: | ||
|
||
rule: str | ||
is_tag: bool | ||
|
||
def __init__(self, rule: str): | ||
try: | ||
self.is_tag = False | ||
self.check_rule(rule) | ||
self.rule = rule | ||
except Exception: | ||
raise ValueError( | ||
"Invalid rule. Please provide a valid rule or supply the wild card *." | ||
) | ||
|
||
def check_rule(self, value: str) -> None: | ||
if value is None or len(value.strip()) == 0: | ||
raise ValueError( | ||
"Rule can not be None or empty string. Please provide a valid rule or supply the wild card *." | ||
) | ||
# Check Wild Card | ||
if value == "*": | ||
return | ||
# Check if IP Address | ||
try: | ||
ipaddress.ip_address(value) | ||
return | ||
except ValueError: | ||
pass | ||
# Check if IP Range | ||
try: | ||
ipaddress.ip_network(value) | ||
return | ||
except ValueError: | ||
pass | ||
|
||
self.is_tag = True | ||
|
||
|
||
def update_allowed_aad_tenants( | ||
config_client: InstanceConfigClient, tenants: List[UUID] | ||
) -> None: | ||
as_str = [str(x) for x in tenants] | ||
config_client.table_service.insert_or_merge_entity( | ||
TABLE_NAME, | ||
{ | ||
"PartitionKey": config_client.resource_group, | ||
"RowKey": config_client.resource_group, | ||
"allowed_aad_tenants": json.dumps(as_str), | ||
}, | ||
) | ||
|
||
|
||
def update_admins(config_client: InstanceConfigClient, admins: List[UUID]) -> None: | ||
admins_as_str: Optional[List[str]] = None | ||
if admins: | ||
admins_as_str = [str(x) for x in admins] | ||
|
||
config_client.table_service.insert_or_merge_entity( | ||
TABLE_NAME, | ||
{ | ||
"PartitionKey": config_client.resource_group, | ||
"RowKey": config_client.resource_group, | ||
"admins": json.dumps(admins_as_str), | ||
}, | ||
) | ||
|
||
|
||
def parse_rules(rules_str: str) -> List[NsgRule]: | ||
rules_list = rules_str.split(",") | ||
|
||
nsg_rules = [] | ||
for rule in rules_list: | ||
try: | ||
nsg_rule = NsgRule(rule) | ||
nsg_rules.append(nsg_rule) | ||
except Exception: | ||
raise ValueError( | ||
"One or more input rules was invalid. Please enter a comma-separted list if valid sources." | ||
) | ||
return nsg_rules | ||
|
||
|
||
def update_nsg( | ||
config_client: InstanceConfigClient, | ||
allowed_rules: List[NsgRule], | ||
) -> None: | ||
tags_as_str = [x.rule for x in allowed_rules if x.is_tag] | ||
ips_as_str = [x.rule for x in allowed_rules if not x.is_tag] | ||
nsg_config = {"allowed_service_tags": tags_as_str, "allowed_ips": ips_as_str} | ||
# create class initialized by table service/resource group outside function that's checked in deploy.py | ||
config_client.table_service.insert_or_merge_entity( | ||
TABLE_NAME, | ||
{ | ||
"PartitionKey": config_client.resource_group, | ||
"RowKey": config_client.resource_group, | ||
"proxy_nsg_config": json.dumps(nsg_config), | ||
}, | ||
) | ||
|
||
|
||
if __name__ == "__main__": | ||
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,4 +8,4 @@ azure-storage-blob==12.8.1 | |
pyfunctional==1.4.3 | ||
pyopenssl==19.1.0 | ||
adal~=1.2.5 | ||
idna<3,>=2.5 | ||
idna<3,>=2.5 |
Oops, something went wrong.