Skip to content

Commit

Permalink
WIP repro stuff, add simple create nested items sh script
Browse files Browse the repository at this point in the history
  • Loading branch information
dwdozier committed Jul 28, 2023
1 parent 80b1cd5 commit 47576a2
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 87 deletions.
73 changes: 54 additions & 19 deletions repro/common/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,10 @@ def create_project(name, api_url, headers, parent=None):
return project


def delete_project(project, api_url, headers, force=False):
def delete_project(project, api_url, headers):
project_and_dependents = get_project_tree_projects(project, api_url, headers)

for project in reversed(project_and_dependents):
if force:
delete_project_parameters(project, api_url, headers)
console.log(f"Deleting project: {project.get('name')}")
delete_object(project, 'projects', api_url, headers)

Expand All @@ -137,7 +135,7 @@ def get_project_tree_projects(project, api_url, headers, projects=None):
return None
if projects is None:
projects = []
console.log(f"Adding parent, {project.get('name')} to the list")
console.log(f"Adding parent, {project.get('name')} to the array of projects")
projects.append(project) # put the parent in the list on init
if project_has_dependents(project):
child_project_urls = project.get('dependents')
Expand All @@ -164,6 +162,58 @@ def get_all_top_level_projects(api_url, headers):

return top_level_projects

# ENVIRONMENTS

def create_environment(name, api_url, headers, parent=None):
env_url = f'{api_url}/environments/'
parent_uri = parent.get('url') if parent is not None else ''
body = {
"name": name,
"parent": parent_uri
}

env = make_request(env_url, 'post', headers, body).json()

return env

def delete_environment(environment, api_url, headers):
if environment == 'default':
return False

environment_and_dependents = get_environment_tree_environments(environment, api_url, headers)

for environment in reversed(environment_and_dependents):
console.log(f"Deleting environment: {environment.get('name')}")
delete_object(environment, 'environments', api_url, headers)

def environment_has_dependents(environment):
child_environment_urls = environment.get('children')
if len(child_environment_urls) > 0:
return True

return False

def get_environment_tree_environments(environment, api_url, headers, environments=None):
if environment is None:
return None
if environments is None:
environments = []
console.log(f"Adding parent: {environment.get('name')} to the array of environments")
environments.append(environment)
if environment_has_dependents(environment):
child_environment_urls = environment.get('children')
for child_environment_url in child_environment_urls:
child_environment = make_request(child_environment_url, 'get', headers).json()
if environment_has_dependents(child_environment):
console.log(f"Adding a child to the list, {child_environment.get('name')} with dependencies")
environments.append(child_environment)
get_environment_tree_environments(child_environment, api_url, headers, environments)
else:
console.log(f"Adding a child to the list, {child_environment.get('name')} with no dependencies")
environments.append(child_environment)

return environments


# PARAMETERS

Expand Down Expand Up @@ -198,21 +248,6 @@ def delete_parameter(project_id, parameter, api_url, headers):
make_request(parameter_url, 'delete', api_url, headers)


# ENVIRONMENTS

def create_environment(name, api_url, headers, parent=None):
env_url = f'{api_url}/environments/'
parent_uri = parent.get('url') if parent is not None else ''
body = {
"name": name,
"parent": parent_uri
}

env = make_request(env_url, 'post', headers, body).json()

return env


# MISC

def nuke():
Expand Down
171 changes: 103 additions & 68 deletions repro/ct_org_repro_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import argparse
from argparse import RawTextHelpFormatter
from os import environ
import shortuuid
from rich.console import Console
from common import helpers
Expand Down Expand Up @@ -41,6 +42,11 @@ def parse_args():
help='base type, template create or delete',
action='store_true',
)
parser.add_argument(
'--params',
help='base type, parameter create or delete',
action='store_true',
)
parser.add_argument(
'--project-root-name',
nargs='?',
Expand Down Expand Up @@ -176,27 +182,45 @@ def delete_all_parameters():
helpers.delete_project_parameters(project, _api_url, _headers)


def delete_all_projects(force=False):
console.print('Deleting all projects')
def delete_all_projects():
projects = helpers.get_all_top_level_projects(_api_url, _headers)

if not projects:
return None

for project in projects:
helpers.delete_project(project, _api_url, _headers, force)
helpers.delete_project(project, _api_url, _headers)

return True


def delete_single_project(project_root_name=None, force=False):
def delete_single_project(project_root_name=None):
project = helpers.get_object_by_name(project_root_name, 'projects', _api_url, _headers)

if not project:
return None

console.print(f"Deleting project: {project.get('name')} and all dependents")
# helpers.delete_project(project, _api_url, _headers, force)
helpers.delete_project(project, _api_url, _headers)
return True

def delete_single_environment(environment_root_name=None):
environment = helpers.get_object_by_name(environment_root_name, 'environments', _api_url, _headers)

if not environment:
return None

helpers.delete_environment(environment, _api_url, _headers)
return True

def delete_all_environments():
environments = helpers.get_objects_list('environments', _api_url, _headers)

if not environments:
return None

for environment in environments:
helpers.delete_environment(environment, _api_url, _headers)

return True


Expand Down Expand Up @@ -234,70 +258,73 @@ def main():
global _template_uris
_template_uris = []

if args.create or args.delete:
if args.projects and args.create:
project_count = args.project_count
project_root_name = args.project_root_name
create_projects(project_count, project_root_name)
if args.levels:
projects = helpers.get_objects_list('projects', _api_url, _headers)
i = 0
while i < args.levels:
for project in projects:
create_projects(project_count, project.get('name'))
i += 1
# create projects
if args.projects and args.create:
console.print('creating projects')
project_count = args.project_count
project_root_name = args.project_root_name
create_projects(project_count, project_root_name)
if args.levels:
projects = helpers.get_objects_list('projects', _api_url, _headers)
i = 0
while i < args.levels:
for project in projects:
create_projects(project_count, project.get('name'))
i += 1

# delete projects
if args.projects and args.delete:
if args.project_root_name:
console.print(f"Deleting project: {args.project_root_name} and all dependents")
result = delete_single_project(args.project_root_name)
if not result:
console.print('Project not found or could not be deleted')
exit(EXIT_ERR)
else:
if args.projects:
if args.project_root_name:
result = delete_single_project(args.project_root_name, args.force)
if not result:
console.print('Project not found')
exit(EXIT_ERR)
else:
result = delete_all_projects(args.force)
if not result:
console.print('No projects found')
if args.environments and args.create:
console.print('creating environments')
console.print('Deleting all projects')
result = delete_all_projects()
if not result:
console.print('No projects found')

# create environments
if args.environments and args.create:
console.print('creating environments')
env_count = args.environment_count
env_root_name = args.environment_root_name
create_envs(env_count, env_root_name)
if args.levels:
environments = helpers.get_objects_list('environments', _api_url, _headers)
i = 0
while i < args.levels:
for env in environments:
create_envs(env_count, env.get('name'))
i += 1

# delete environments
if args.environments and args.delete:
if args.environment_root_name == 'default':
console.print('Cannot delete thedefault environment')
exit(EXIT_ERR)
if args.environment_root_name:
console.print(f"Deleting environment: {args.environment_root_name} and all dependents")
result = delete_single_environment(args.environment_root_name)
if not result:
console.print('Environment not found or could not be deleted')
exit(EXIT_ERR)
else:
if args.environments:
console.print('deleting environments')
if args.templates and args.create:
console.print('creating templates')
else:
if args.templates:
console.print('deleting templates')

# # reset org
# if args.reset_org and args.force:
# console.print('Nuking everything')
# # implement y/n
# foo = helpers.nuke()
# console.print('Nuke complete')
# exit(foo)

# # create environments
# env_count = args.envs
# parent_env_name = args.base_env
# if env_count > 0 and args.delete_force is not True:
# console.print('Creating environments')
# parent_uri = helpers.get_object_by_name(
# parent_env_name,
# 'environments',
# _api_url,
# _headers
# )

# create_envs(env_count, parent_uri)
# console.print(f'Created {env_count} new environments under the {parent_env_name} environment')

# # create parameters
# param_count = args.params
# if param_count > 0 and args.delete_force is not True:
# console.print('Creating parameters')
# for project in _projects:
# create_params(param_count, project)
# console.print(f'Created {param_count} parameters in each of {_projects.count()} projects' )
console.print('Deleting all environments (except default)')
result = delete_all_environments()
if not result:
console.print('No environments found')

# create parameters
if args.params and args.create:
param_count = args.params
if param_count > 0 and args.delete_force is not True:
console.print('Creating parameters')
for project in _projects:
create_params(param_count, project)
console.print(f'Created {param_count} parameters in each of {_projects.count()} projects' )

# if args.delete_project_force:
# delete_params = True
Expand All @@ -309,6 +336,14 @@ def main():

# helpers.delete_project(project, _api_url, _headers, delete_params)

# # reset org
# if args.reset_org and args.force:
# console.print('Nuking everything')
# # implement y/n
# foo = helpers.nuke()
# console.print('Nuke complete')
# exit(foo)

# TODO: implement template create
# TODO: implement destroy_params
# TODO: implement destroy_envs
Expand Down
44 changes: 44 additions & 0 deletions repro/many-nested.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash

ROOT_NAME="project-count-limits"
MAX_DEPTH=5
CHILDREN_PER_TIER=4

# Main script
main() {
local config_profile="$1"
local ct_type="$2"
local root="$ROOT_NAME"
local max_depth="$MAX_DEPTH"
local num_children="$CHILDREN_PER_TIER"

echo "Creating root: $root"
cloudtruth --profile "$config_profile" "$ct_type" set "$root"

declare -a current_depth_array
declare -a next_depth_array
current_depth_array=("$root")

for (( depth = 1; depth <= max_depth; depth++ )); do
next_depth_array=()

for current_item in "${current_depth_array[@]}"; do
for (( i = 1; i <= num_children; i++ )); do
local item="${current_item}_child${i}"
cloudtruth --profile "$config_profile" "$ct_type" set -p "$current_item" "$item"
next_depth_array+=("$item")
done
echo "Created/Updated $(( num_children )) items"
done

current_depth_array=("${next_depth_array[@]}")
echo "Created/Updated $(( ${#current_depth_array[@]} )) items at depth $depth"
done

echo "Created/Updated $(( num_children^max_depth )) items total"
}

# Run the main script
## $1 = config_profile
## $2 = ct_type (projects or environments)
main "$@"

0 comments on commit 47576a2

Please sign in to comment.