28mm / blast-radius Goto Github PK
View Code? Open in Web Editor NEWInteractive visualizations of Terraform dependency graphs using d3.js
Home Page: https://28mm.github.io/blast-radius-docs/
License: MIT License
Interactive visualizations of Terraform dependency graphs using d3.js
Home Page: https://28mm.github.io/blast-radius-docs/
License: MIT License
Hi,
I have to work in an airgapped environment (without internet connection) where it is not possible to simply run "terraform init" or anything like this. We developed some helper framework to run terraform through a WebProxy but any call to terraform involves a lot of environment variables and a special setup of credential files for AWS and such. When I try using blast-radius I always get errors like "Failed to load backend" due to invalid credentials and the missing internet connection.
Is it somehow possible to run blast-radius off a pre created graph file? Something that does not involve any "terraform" call inside the docker container?
I already tried --graph like
docker run --cap-add=SYS_ADMIN -it --rm -p 5000:5000 -v $(pwd):/workdir:ro docker.registry.local/joerg/blast-radius --serve --graph global/my.graph global
but this gives the before mentioned errors. Interestingly it works with --json, --dot and --svg which gives me a huge JSON output
docker run --cap-add=SYS_ADMIN -it --rm -p 5000:5000 -v $(pwd):/workdir:ro docker.registry.local/joerg/blast-radius --json --graph global/my.graph global
Please consider the support for Terraform Workspaces.
I started up blast-radius using the instructions in the README with a very basic Terraform setup from the introductory tutorial..
The tooltip strobes on/off rapidly. So fast that it is somewhat hard to see in this gif:
I store my AWS credentials far, far away from my Terraform source code, preferring per-project access keys and a profile configured via aws configure
. I add 2 additional options to my docker run command:
-v ~/.aws:/root/.aws -e AWS_PROFILE=projectprofile \
Adding the volume ~/.aws gives the scripts access to the saved keys I have, and the environment tells which one to use.
Hope this may help somebody.
Hi, it seems that the last two builds in CircleCI were broken and as a result, the Docker Image was not updated to using Terraform 0.12.12.
I would be awesome if you could filter by resource type, especially for stacks that use a large number of var
s.
For instance, in our AWS terraform stack, a good majority of our nodes are either vars or cloudwatch resources, and it would be cool to be able to filter those out and show just the "important" stuff.
I noticed the graph generated is not interactive when using HCL2 syntax vs the old.
Is there a solution available for this?
I'd like to just see the picture of my config without installing too much libs on my system to avoid breaking things. But it doesn't work.
โ terraform graph -draw-cycles | docker run -i 28mm/blast-radius
mount: /tmp/overlay: permission denied.
/src/docker-entrypoint.sh: line 14: cd: /workdir-rw: No such file or directory
I read that using CAP_SYS_ADMIN is a bad security practice. Is it possible to build container without it? Or make it optional.
No graph/icon is displayed on either Chrome or Firefox; run in directory that has 'terraform init --reconfigure'; I generated a graph.svg in the same directory
ProductName: Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G1212
Google Chrome 64.0.3282.186
blast-radius --serve
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [26/Feb/2018 10:55:05] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Feb/2018 10:55:07] "GET /graph.svg HTTP/1.1" 500 -
127.0.0.1 - - [26/Feb/2018 10:56:26] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Feb/2018 10:56:28] "GET /graph.svg HTTP/1.1" 500 -
127.0.0.1 - - [26/Feb/2018 10:57:28] "GET /static/js/bootstrap.min.js.map HTTP/1.1" 404 -
127.0.0.1 - - [26/Feb/2018 10:57:28] "GET /static/css/bootstrap.min.css.map HTTP/1.1" 404 -
Also tried using blast-radius --serve .
and blast-radius --serve /full_path/foo/bar
I've spend a few hours looking at blast radius and it looks great!
What I was aiming to achieve was automatically generating Architecture diagrams anytime our terraform script changed.
My issue is that the level of detail is very detailed, I'm wanting a diagram that shows S3 connects to lambda, which goes to dyno then a SNS queue etc.
I'm wondering if theres a way to restrict the UI being served to only show the top level of each terraform resource we are defining not the variables (as we have heaps of tags and other stuff).
Any suggestions?
A utility like this should be as small as possible. Building it on Alpine Linux would be far more favorable than having to download the Ubuntu image.
It'd be nice to add some basic GUI bits to the web interface. This issue is to track progress and provide a mechanism for comment. Initial goals listed below, along with a mockup.
i download the zip code and extract. put one *.tf file in same directory. after running the below command, i got error mentioned below:
command:
docker build -t blast-radius - < Dockerfile
error:
chmod: cannot access './docker-build.sh': No such file or directory
Blast Radius displays resource definitions as json blobs, without syntax highlighting or annotations of any kind. (json rather than hcl because pyHCL made this easier.)
Because the primary concern of Blast Radius is understanding the scope of change-sets, it would be useful if resource properties were marked to indicate whether:
required : true
, orForceNew : true
In order to build a library of resource auto-completions, the vim-terraform project collects the top 100(?) projects from GitHub that match the pattern terraform-provider-*
, then applies some perl or what-have-you to obtain resource names and associated properties.
It would be interesting to borrow as much of this code as is easily adaptable, and do something similiar for Blast Radius. I expect the ForceNew
property to be of particular interest.
When clicking on a particular entity, it highlights all the outbound (downstream) connections but excludes all the inbound (upstream connections).
Any particular reason you chose to do this?
Perhaps you could have a toggle where users can choose whether to highlight:
The version of Terraform included in the Docker image is relatively old now. If you are using remote state and a newer version of Terraform, you cannot run blast-radius without editing the Dockerfile, update the TF_VERSION variable, and building a new image.
I'd like to propose building/maintaining multiple versions of the blast-radius container for x number of current versions of Terraform, and using tags to pull the proper version.
I don't see any CI stuff in the repository, otherwise I'd submit a PR against that.
I get the following error with blast-radius 0.1.12:
A debug mode would be helpful for finding the file that the parser doesn't like. Terraform plan/apply works fine so it's happy with the HCL blast-radius is parsing.
I attempted to use pip3 to install this app, and didn't find the app due to it being named "BlastRadius" and not "blast-radius" in the pip directory.
Once I was able to find the correct casing for the app, the installer yielded the following:
$ sudo pip3 install BlastRadius
Collecting BlastRadius
Using cached BlastRadius-0.1.4.tar.gz
Requirement already satisfied: Flask in /usr/local/lib/python3.5/dist-packages (from BlastRadius)
Requirement already satisfied: jinja2 in /usr/lib/python3/dist-packages (from BlastRadius)
Requirement already satisfied: pyhcl in /usr/local/lib/python3.5/dist-packages (from BlastRadius)
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from BlastRadius)
Requirement already satisfied: BeautifulSoup4 in /usr/local/lib/python3.5/dist-packages (from BlastRadius)
Requirement already satisfied: itsdangerous>=0.21 in /usr/local/lib/python3.5/dist-packages (from Flask->BlastRadius)
Requirement already satisfied: click>=2.0 in /usr/local/lib/python3.5/dist-packages (from Flask->BlastRadius)
Requirement already satisfied: Werkzeug>=0.7 in /usr/local/lib/python3.5/dist-packages (from Flask->BlastRadius)
Requirement already satisfied: MarkupSafe in /usr/lib/python3/dist-packages (from jinja2->BlastRadius)
Requirement already satisfied: ply==3.10 in /usr/local/lib/python3.5/dist-packages (from pyhcl->BlastRadius)
Building wheels for collected packages: BlastRadius
Running setup.py bdist_wheel for BlastRadius ... error
Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;file='/tmp/pip-build-4gaediim/BlastRadius/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" bdist_wheel -d /tmp/tmpw8ouc3sjpip-wheel- --python-tag cp35:
running bdist_wheel
running build
running build_py
creating build
creating build/lib
creating build/lib/blastradius
copying blastradius/init.py -> build/lib/blastradius
copying blastradius/graph.py -> build/lib/blastradius
copying blastradius/util.py -> build/lib/blastradius
creating build/lib/blastradius/handlers
copying blastradius/handlers/init.py -> build/lib/blastradius/handlers
copying blastradius/handlers/apply.py -> build/lib/blastradius/handlers
copying blastradius/handlers/dot.py -> build/lib/blastradius/handlers
copying blastradius/handlers/plan.py -> build/lib/blastradius/handlers
copying blastradius/handlers/terraform.py -> build/lib/blastradius/handlers
creating build/lib/blastradius/server
copying blastradius/server/init.py -> build/lib/blastradius/server
copying blastradius/server/server.py -> build/lib/blastradius/server
error: can't copy 'blastradius/pycache': doesn't exist or not a regular file
Failed building wheel for BlastRadius
Running setup.py clean for BlastRadius
Failed to build BlastRadius
Installing collected packages: BlastRadius
Running setup.py install for BlastRadius ... error
Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;file='/tmp/pip-build-4gaediim/BlastRadius/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-kw55m4su-record/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/blastradius
copying blastradius/init.py -> build/lib/blastradius
copying blastradius/graph.py -> build/lib/blastradius
copying blastradius/util.py -> build/lib/blastradius
creating build/lib/blastradius/handlers
copying blastradius/handlers/init.py -> build/lib/blastradius/handlers
copying blastradius/handlers/apply.py -> build/lib/blastradius/handlers
copying blastradius/handlers/dot.py -> build/lib/blastradius/handlers
copying blastradius/handlers/plan.py -> build/lib/blastradius/handlers
copying blastradius/handlers/terraform.py -> build/lib/blastradius/handlers
creating build/lib/blastradius/server
copying blastradius/server/init.py -> build/lib/blastradius/server
copying blastradius/server/server.py -> build/lib/blastradius/server
error: can't copy 'blastradius/pycache': doesn't exist or not a regular file
----------------------------------------
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;file='/tmp/pip-build-4gaediim/BlastRadius/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-kw55m4su-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-4gaediim/BlastRadius/
the directory exists, is there a globbing issue with your installer path?
Hi, just a quick suggestion to add a loading indicator, of some sort.
I've been trying to get Blast Radius to work all day and couldn't figure out why the graph.svg
file would hang in my Chrome inspector. It just says "(pending)" for a long while and I thought something had been misconfigured or wasn't working properly.
After finding #25, however, I realized that nothing was wrong, after all, and it was just taking a while for the graph to be generated (~8 minutes), presumably because our Terraform config is relatively large (though, it's really not HUGE by any reasonable standard).
With that said, Blast Radius does not provide any indication that the graph is being generated behind the scenes and I think its very easy for people to assume that it's broken when nothing appears. So, I think the user should be informed about the ongoing render process in some way, if at all possible.
Of course I realize that this project probably doesn't justify a ton of time and expense and that it was created as a sort of proof-of-concept, but, still, I thought it would be useful for me to share my experience and provide the suggestion.
A few other notes:
graph.json
laggs behind graph.svg
, which is also not obvious.Anyway, thanks for the awesome utility!
Hi
I have tried example from README and got error:
gcp-tf $ docker run --cap-add=SYS_ADMIN -it --rm -p 5000:5000 -v $(pwd):/workdir:ro 28mm/blast-radius
mount: /tmp/overlay: cannot mount tmpfs read-only.
/src/docker-entrypoint.sh: line 14: cd: /workdir-rw: No such file or directory
I ran into this issue which I think has to do with the specify svg graph as I wasn't able to open the svg with certain program like GIMP (but can open with other program and terraform graph itself doesn't show error). I don't know much about svg to know why it'd cause such error.
terraform graph | blast-radius --svg > graph.svg
Traceback (most recent call last):
File "/Users/antho/Library/Python/3.6/bin//blast-radius", line 95, in <module>
main()
File "/Users/antho/Library/Python/3.6/bin//blast-radius", line 53, in main
dot = DotGraph('', file_contents=sys.stdin.read())
File "/Users/antho/Library/Python/3.6/lib/python/site-packages/blastradius/handlers/dot.py", line 56, in __init__
self.nodes.append(DotNode(e.target))
File "/Users/antho/Library/Python/3.6/lib/python/site-packages/blastradius/handlers/dot.py", line 414, in __init__
self.module = DotNode._module(label) # for module groupings. 'root' or 'module.foo.module.bar'
File "/Users/antho/Library/Python/3.6/lib/python/site-packages/blastradius/handlers/dot.py", line 448, in _module
return m.groupdict()['module']
AttributeError: 'NoneType' object has no attribute 'groupdict'```
hey there - i get this message when trying to install your amazing tool!
pip3 install blast-radius
Collecting blast-radius
Could not find a version that satisfies the requirement blast-radius (from versions: )
No matching distribution found for blast-radius
This is a question; with terraform it is possible to display specific resource/module by using the target feature with plan, e.g:
terraform plan -target=resource.foo -o=plan.tfplan
terraform graph -verbose plan.tfplan | dot -Tpng > graph.png
Is that also possible to display only that specific graph with blast-radius?
Currently if I use apply the same specific graph with:
terraform graph -verbose plan.tfplan | blast-radius --svg > graph.svg
It would still display the entire graph (unlike in graph.png) (perhaps due to the parsing of the HCL which isn't targeted)
TF version v.12.9
azure rm
running on windows 10.
I cant see how to witch debug mode on tried --debug, but if you can let me know I'll try again to get more info.
127.0.0.1 - - [13/Oct/2019 16:06:46] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Oct/2019 16:06:49] "GET /graph.svg HTTP/1.1" 200 -
[2019-10-13 16:06:50,729] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "C:\Python37\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python37\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python37\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python37\lib\site-packages\flask_compat.py", line 39, in reraise
raise value
File "C:\Python37\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python37\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functionsrule.endpoint
File "C:\Python37\lib\site-packages\blastradius\server\server.py", line 61, in graph_json
tf = Terraform(os.getcwd())
File "C:\Python37\lib\site-packages\blastradius\handlers\terraform.py", line 26, in init
self.config = hcl.load(config_io)
File "C:\Python37\lib\site-packages\hcl\api.py", line 54, in load
return loads(fp.read())
File "C:\Python37\lib\site-packages\hcl\api.py", line 66, in loads
return HclParser().parse(s)
File "C:\Python37\lib\site-packages\hcl\parser.py", line 326, in parse
return self.yacc.parse(s, lexer=Lexer())
File "C:\Python37\lib\site-packages\ply\yacc.py", line 333, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "C:\Python37\lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "C:\Python37\lib\site-packages\ply\yacc.py", line 192, in call_errorfunc
r = errorfunc(token)
File "C:\Python37\lib\site-packages\hcl\parser.py", line 318, in p_error
raise ValueError(msg)
ValueError: Line 55, column 1607: unexpected IDENTIFIER
127.0.0.1 - - [13/Oct/2019 16:06:50] "GET /graph.json HTTP/1.1" 500 -
Hi I followed all the steps to generate graph.svg, but I keep getting 400 resource not found when running blast-radius
Hi again:
/path/to/init-ed Terraform project
means what exactly?
Thank you
127.0.0.1 - - [14/Nov/2018 15:41:27] "GET /graph.svg HTTP/1.1" 200 -
[2018-11-14 15:41:30,641] ERROR in app: Exception on /graph.json [GET]
.....
raise ValueError("Line %d, column %d, index %d: %s" % (lineno, column, lexpos, message))
ValueError: Line 25, column 0, index 595: Found '*/' before start of multiline comment
fwiw, this happens using https://github.com/crossbario/terraform-aws-crossbar :
27.0.0.1 - - [11/Jul/2020 00:56:49] "GET /graph.svg HTTP/1.1" 200 -
[2020-07-11 00:56:50,110] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/blastradius/server/server.py", line 61, in graph_json
tf = Terraform(os.getcwd())
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/blastradius/handlers/terraform.py", line 67, in __init__
self.modules[name] = Terraform(directory=self.directory+'/'+source, settings=mod)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/blastradius/handlers/terraform.py", line 26, in __init__
self.config = hcl.load(config_io)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/hcl/api.py", line 62, in load
return loads(fp.read(), export_comments=export_comments)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/hcl/api.py", line 81, in loads
return HclParser().parse(s, export_comments=export_comments)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/hcl/parser.py", line 642, in parse
return self.yacc.parse(
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/hcl/ply/yacc.py", line 503, in parse
tok = self.errorfunc(errtoken)
File "/home/oberstet/cpy382_1/lib/python3.8/site-packages/hcl/parser.py", line 634, in p_error
raise ValueError(msg)
ValueError: Line 1353, column 41614: unexpected LEFTBRACKET; expected COMMA, IDENTIFIER, STRING, COMMENT, MULTICOMMENT, MINUS, NUMBER, FLOAT, $end, RIGHTBRACE, RIGHTBRACKET, RIGHTPAREN, PERIOD
127.0.0.1 - - [11/Jul/2020 00:56:50] "GET /graph.json HTTP/1.1" 500 -
COREOS TECTONIC VERSION
curl -O https://releases.tectonic.com/releases/tectonic_1.8.4-tectonic.3.zip
ERROR
tf = Terraform(os.getcwd())
File "/usr/lib/python3.6/site-packages/blastradius/handlers/terraform.py", line 49, in init
self.modules[name] = Terraform(directory=self.directory+'/'+source, settings=mod)
File "/usr/lib/python3.6/site-packages/blastradius/handlers/terraform.py", line 26, in init
self.config = hcl.load(config_io)
File "/usr/lib/python3.6/site-packages/hcl/api.py", line 51, in load
return loads(fp.read())
File "/usr/lib/python3.6/site-packages/hcl/api.py", line 62, in loads
return HclParser().parse(s)
File "/usr/lib/python3.6/site-packages/hcl/parser.py", line 307, in parse
return self.yacc.parse(s, lexer=Lexer())
File "/usr/lib/python3.6/site-packages/ply/yacc.py", line 331, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "/usr/lib/python3.6/site-packages/ply/yacc.py", line 1061, in parseopt_notrack
lookahead = get_token() # Get the next token
File "/usr/lib/python3.6/site-packages/hcl/lexer.py", line 275, in token
return self.lex.token()
File "/usr/lib/python3.6/site-packages/ply/lex.py", line 406, in token
newtok = self.lexeoff(tok)
File "/usr/lib/python3.6/site-packages/hcl/lexer.py", line 222, in t_heredoc_eof
_raise_error(t, 'EOF before closing heredoc')
File "/usr/lib/python3.6/site-packages/hcl/lexer.py", line 17, in _raise_error
raise ValueError("Line %d, column %d, index %d: %s" % (lineno, column, lexpos, message))
ValueError: Line 438, column 1, index 12356: EOF before closing heredoc
Narrowed it down to these source objects and resources
modules/ignition
'ignition_masters': {'source': '../../modules/ignition', 'base_domain': '${var.tectonic_base_domain}', 'bootstrap_upgrade_cl': '${var.tectonic_bootstrap_upgrade_cl}', 'cluster_name': '${var.tectonic_cluster_name}', 'container_images': '${var.tectonic_container_images}', 'etcd_advertise_name_list': '${data.template_file.etcd_hostname_list..rendered}', 'etcd_count': '${length(data.template_file.etcd_hostname_list..rendered)}', 'etcd_initial_cluster_list': '${data.template_file.etcd_hostname_list.*.rendered}', 'etcd_tls_enabled': '${var.tectonic_etcd_tls_enabled}', 'image_re': '${var.tectonic_image_re}', 'kube_dns_service_ip': '${module.bootkube.kube_dns_service_ip}', 'kubelet_cni_bin_dir': '${var.tectonic_networking == "calico" || var.tectonic_networking == "canal" ? "/var/lib/cni/bin" : "" }', 'kubelet_debug_config': '${var.tectonic_kubelet_debug_config}', 'kubelet_node_label': 'node-role.kubernetes.io/master', 'kubelet_node_taints': 'node-role.kubernetes.io/master=:NoSchedule', 'use_metadata': False, 'tectonic_vanilla_k8s': '${var.tectonic_vanilla_k8s}'},
modules/vmware/node
'masters': {'source': '../../modules/vmware/node', 'base_domain': '${var.tectonic_base_domain}', 'container_images': '${var.tectonic_container_images}', 'core_public_keys': ['${var.tectonic_vmware_ssh_authorized_key}'], 'dns_server': '${var.tectonic_vmware_node_dns}', 'gateways': '${var.tectonic_vmware_master_gateways}', 'hostname': '${var.tectonic_vmware_master_hostnames}', 'ign_bootkube_path_unit_id': '${module.bootkube.systemd_path_unit_id}', 'ign_bootkube_service_id': '${module.bootkube.systemd_service_id}', 'ign_docker_dropin_id': '${module.ignition_masters.docker_dropin_id}', 'ign_installer_kubelet_env_id': '${module.ignition_masters.installer_kubelet_env_id}', 'ign_installer_runtime_mappings_id': '${module.ignition_masters.installer_runtime_mappings_id}', 'ign_k8s_node_bootstrap_service_id': '${module.ignition_masters.k8s_node_bootstrap_service_id}', 'ign_kubelet_service_id': '${module.ignition_masters.kubelet_service_id}', 'ign_locksmithd_service_id': '${module.ignition_masters.locksmithd_service_id}', 'ign_max_user_watches_id': '${module.ignition_masters.max_user_watches_id}', 'ign_tectonic_path_unit_id': '${var.tectonic_vanilla_k8s ? "" : module.tectonic.systemd_path_unit_id}', 'ign_tectonic_service_id': '${module.tectonic.systemd_service_id}', 'image_re': '${var.tectonic_image_re}', 'instance_count': '${var.tectonic_master_count}', 'ip_address': '${var.tectonic_vmware_master_ip}', 'kubeconfig': '${module.bootkube.kubeconfig}', 'private_key': '${var.tectonic_vmware_ssh_private_key_path}', 'vm_disk_datastore': '${var.tectonic_vmware_master_datastore}', 'vm_disk_template': '${var.tectonic_vmware_vm_template}', 'vm_disk_template_folder': '${var.tectonic_vmware_vm_template_folder}', 'vm_memory': '${var.tectonic_vmware_master_memory}', 'vm_network_labels': '${var.tectonic_vmware_master_networks}', 'vm_vcpu': '${var.tectonic_vmware_master_vcpu}', 'vmware_clusters': '${var.tectonic_vmware_master_clusters}', 'vmware_datacenters': '${var.tectonic_vmware_master_datacenters}', 'vmware_folder': '${vsphere_folder.tectonic_vsphere_folder.path}', 'vmware_resource_pool': '${var.tectonic_vmware_master_resource_pool}'},
I've been following this project from the beginning and this is very interesting. You've thought about this before in a blog post :
It would be nice to have an option to monitor the terraform state file and mutate the graph when things are getting deployed.
I'm wondering how the current architecture is ready for this.
When I attempt to run blast-radius against some of my larger Terraform modules, I'm getting the following:
127.0.0.1 - - [24/Apr/2018 13:46:40] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [24/Apr/2018 13:46:42] "GET /graph.svg HTTP/1.1" 200 -
[2018-04-24 13:46:43,373] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/blastradius/server/server.py", line 57, in graph_json
tf = Terraform(os.getcwd())
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/blastradius/handlers/terraform.py", line 49, in __init__
self.modules[name] = Terraform(directory=self.directory+'/'+source, settings=mod)
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/blastradius/handlers/terraform.py", line 26, in __init__
self.config = hcl.load(config_io)
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/hcl/api.py", line 51, in load
return loads(fp.read())
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/hcl/api.py", line 61, in loads
if isHcl(s):
File "my_home/.local/share/virtualenvs/blast-radius-g0pBURgw/lib/python3.5/site-packages/hcl/api.py", line 39, in isHcl
raise ValueError("No HCL object could be decoded")
ValueError: No HCL object could be decoded
This module in particular has 243 edges:
$ terraform graph | grep -c '\->'
243
When I run blast-radius against my smaller modules, it can generate the graph.json just fine.
Is there any way i can integrate blast radius with a react project? Any pointers would be very helpful. Thanks
Hello, I'm trying this out with a terraform 0.12 project (which I suspect could be the root issue). The terraform is planned/applied successfully. The blast-radius graph draws on the screen but is not interactive. The blast-radius server shows this output:
[2019-05-30 13:06:33,958] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2311, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1834, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1737, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 36, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1832, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1818, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.7/site-packages/blastradius/server/server.py", line 61, in graph_json
tf = Terraform(os.getcwd())
File "/usr/local/lib/python3.7/site-packages/blastradius/handlers/terraform.py", line 26, in __init__
self.config = hcl.load(config_io)
File "/usr/local/lib/python3.7/site-packages/hcl/api.py", line 54, in load
return loads(fp.read())
File "/usr/local/lib/python3.7/site-packages/hcl/api.py", line 66, in loads
return HclParser().parse(s)
File "/usr/local/lib/python3.7/site-packages/hcl/parser.py", line 326, in parse
return self.yacc.parse(s, lexer=Lexer())
File "/usr/local/lib/python3.7/site-packages/ply/yacc.py", line 333, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "/usr/local/lib/python3.7/site-packages/ply/yacc.py", line 1201, in parseopt_notrack
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "/usr/local/lib/python3.7/site-packages/ply/yacc.py", line 192, in call_errorfunc
r = errorfunc(token)
File "/usr/local/lib/python3.7/site-packages/hcl/parser.py", line 318, in p_error
raise ValueError(msg)
ValueError: Line 18, column 423: unexpected IDENTIFIER
172.27.192.130 - - [30/May/2019 13:06:33] "GET /graph.json HTTP/1.1" 500 -
Is there a way to find the unexpected identifier to debug further? I tried running blast-radius
with --debug
but it was not a valid flag.
Hi, has anyone tried hosting this awesome tool on Azure? Either App Service or Azure Function is fine.
I tried a few things but I am a python beginner so I am basically just asking for any clues on how to get it running :)
It trips up on the host = self.public_ip
line.
connection {
type = "ssh"
host = self.public_ip
user = "ec2-user"
private_key = "${file(var.private_key_path)}"
}
to give this error message:
ValueError: Line 27, column 496: unexpected IDENTIFIER
127.0.0.1 - - [15/Aug/2019 21:38:44] "GET /graph.json HTTP/1.1" 500 -
Works fine if I remove that line.
Currently getting the following version using terraform 12.18
The hardcoded 12.12 version is affected by a git bug that prevents modules from working.
I am running the following in a docker container
ARG TF_VERSION=latest
ARG PYTHON_VERSION=3.7
FROM hashicorp/terraform:$TF_VERSION AS terraform
FROM python:$PYTHON_VERSION-alpine
RUN pip install -U pip ply \
&& apk add --update --no-cache graphviz ttf-freefont
COPY --from=terraform /bin/terraform /bin/terraform
COPY ./docker-entrypoint.sh /bin/docker-entrypoint.sh
RUN chmod +x /bin/docker-entrypoint.sh
WORKDIR /src
COPY . .
RUN pip install -e .
WORKDIR /data
ENTRYPOINT ["/bin/docker-entrypoint.sh"]
CMD ["blast-radius", "--serve"]
Getting an error 500 in chrome and firefox visiting the site.
I did try and upgrade all the python libraries. Could you point me in a good direction? seems like the json parsing isn't right.
* Serving Flask app "blastradius.server.server" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [19/Jan/2020 17:35:13] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [19/Jan/2020 17:35:21] "GET /graph.svg HTTP/1.1" 200 -
[2020-01-19 17:35:27,651] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2311, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1834, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1737, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 36, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1832, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1818, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/src/blastradius/server/server.py", line 61, in graph_json
tf = Terraform(os.getcwd())
File "/src/blastradius/handlers/terraform.py", line 26, in __init__
self.config = hcl.load(config_io)
File "/usr/local/lib/python3.7/site-packages/hcl/api.py", line 54, in load
return loads(fp.read())
File "/usr/local/lib/python3.7/site-packages/hcl/api.py", line 66, in loads
return HclParser().parse(s)
File "/usr/local/lib/python3.7/site-packages/hcl/parser.py", line 326, in parse
return self.yacc.parse(s, lexer=Lexer())
File "/usr/local/lib/python3.7/site-packages/ply/yacc.py", line 333, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "/usr/local/lib/python3.7/site-packages/ply/yacc.py", line 1201, in parseopt_notrack
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "/usr/local/lib/python3.7/site-packages/ply/yacc.py", line 192, in call_errorfunc
r = errorfunc(token)
File "/usr/local/lib/python3.7/site-packages/hcl/parser.py", line 318, in p_error
raise ValueError(msg)
ValueError: Line 10, column 216: unexpected IDENTIFIER
172.17.0.1 - - [19/Jan/2020 17:35:27] "GET /graph.json HTTP/1.1" 500 -
I love you dude,
this has saved me a ton of work.
next pint is on me
blast-radius is not working with latest terraform version.
On inspection, blast-radius builds out terraform version 0.12.3, if a user is using a newer version of terraform they will get the following error:
Error refreshing state: state snapshot was created by Terraform v0.12.12, which is newer than current v0.12.3; upgrade to Terraform v0.12.12 or greater to work with this state
I have updated the terraform version in this PR: #70
Temporary mediation for compose users:
Create a docker-compose file like so:
version: '3.7'
services:
graph:
cap_add:
- SYS_ADMIN
image: gemini-blast-radius # 28mm/blast-radius
build:
context: ./
dockerfile: ./Dockerfile
ports:
- "5000:5000"
expose:
- "5000"
volumes:
- "./:/data"
Create a Dockerfile with the following properties:
ARG TF_VERSION=0.12.12
ARG PYTHON_VERSION=3.7
FROM hashicorp/terraform:$TF_VERSION AS terraform_latest
FROM 28mm/blast-radius
COPY --from=terraform_latest /bin/terraform /bin/terraform
The above compose file pulls blast-radius as is, and then forces the terraform 0.12.12 binary into the blast radius container.
To call blast-radius just call docker--compose graph
from the working directory of your terraform files.
Blast Radius , when launched in --serve
mode, does some pretty weak error reporting, and does nothing to help users resolve problems. It asks the user to look into several possible issues, rather than checking itself...
To observe the current (undesired) behavior, run Blast Radius in an empty directory:
[...]$ mkdir tmp
[...]$ cd tmp
[...]$ blast-radius --serve
A short list of tests/checks to automate:
dot
in its path?)terraform
in its path?)terraform get
needs to run....tf
or .tfvars
?The error page could link to relevant documentation, including the Blast Radius online documentation at https://28mm.github.io/blast-radius-docs
Traceback (most recent call last):
File "/usr/bin/blast-radius", line 14, in
from blastradius.handlers.dot import DotGraph, Format, DotNode
File "/usr/lib/python3.4/site-packages/blastradius/handlers/dot.py", line 394
self.fmt = {**self.fmt, **kwargs}
^
SyntaxError: invalid syntax
Terraform v0.11.10
Im seeing this error (this is a valid tf config that applies successfully). Some other tf state it seems to work fine with, but this one it no like
- Debug mode: off
- Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [21/Jan/2019 09:38:05] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Jan/2019 09:38:10] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Jan/2019 09:38:12] "GET /graph.svg HTTP/1.1" 200 -
[2019-01-21 09:38:14,328] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functionsrule.endpoint
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/blastradius/server/server.py", line 61, in graph_json
tf = Terraform(os.getcwd())
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/blastradius/handlers/terraform.py", line 26, in init
self.config = hcl.load(config_io)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/hcl/api.py", line 51, in load
return loads(fp.read())
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/hcl/api.py", line 62, in loads
return HclParser().parse(s)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/hcl/parser.py", line 307, in parse
return self.yacc.parse(s, lexer=Lexer())
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/ply/yacc.py", line 331, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/ply/yacc.py", line 1199, in parseopt_notrack
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/ply/yacc.py", line 193, in call_errorfunc
r = errorfunc(token)
File "/Users/meee/.pyenv/versions/3.6.5/lib/python3.6/site-packages/hcl/parser.py", line 300, in p_error
raise ValueError(msg)
ValueError: Line 171, column 6458: unexpected RIGHTBRACE
127.0.0.1 - - [21/Jan/2019 09:38:14] "GET /graph.json HTTP/1.1" 500 -
Is it possible to produce colored SVG from command line? Right now it is colored by JavaScript and it is not clear how to get a picture from command line.
Hello, my infra graph is displaying properly with the CSV but I get this error for the graph.json endpoint. Here is the command I am running.
blast-radius --port 3000 --serve --module-depth 3
127.0.0.1 - - [26/Sep/2018 02:59:50] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Sep/2018 02:59:54] "GET /graph.svg HTTP/1.1" 200 -
[2018-09-26 02:59:57,836] ERROR in app: Exception on /graph.json [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.6/site-packages/blastradius/server/server.py", line 57, in graph_json
tf = Terraform(os.getcwd())
File "/usr/local/lib/python3.6/site-packages/blastradius/handlers/terraform.py", line 67, in __init__
self.modules[name] = Terraform(directory=self.directory+'/'+source, settings=mod)
File "/usr/local/lib/python3.6/site-packages/blastradius/handlers/terraform.py", line 26, in __init__
self.config = hcl.load(config_io)
File "/usr/local/lib/python3.6/site-packages/hcl/api.py", line 51, in load
return loads(fp.read())
File "/usr/local/lib/python3.6/site-packages/hcl/api.py", line 62, in loads
return HclParser().parse(s)
File "/usr/local/lib/python3.6/site-packages/hcl/parser.py", line 307, in parse
return self.yacc.parse(s, lexer=Lexer())
File "/usr/local/lib/python3.6/site-packages/ply/yacc.py", line 331, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "/usr/local/lib/python3.6/site-packages/ply/yacc.py", line 1199, in parseopt_notrack
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "/usr/local/lib/python3.6/site-packages/ply/yacc.py", line 193, in call_errorfunc
r = errorfunc(token)
File "/usr/local/lib/python3.6/site-packages/hcl/parser.py", line 300, in p_error
raise ValueError(msg)
ValueError: Line 131, column 4912: unexpected RIGHTBRACE
127.0.0.1 - - [26/Sep/2018 02:59:57] "GET /graph.json HTTP/1.1" 500 -
Any ideas why I'm getting this error:
$ blast-radius
Traceback (most recent call last):
File "/Users/xxx/Library/Python/2.7/bin/blast-radius", line 14, in <module>
from blastradius.handlers.dot import DotGraph, Format, DotNode
File "/Users/xxx/Library/Python/2.7/lib/python/site-packages/blastradius/handlers/dot.py", line 391
print('Error processing format param: ' + 'p', file=sys.stderr)
^
SyntaxError: invalid syntax
Mac OSX 10.13.6 (High Sierra)
Python version: 2.7.10
Running : blast-radius --serve .
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [28/Nov/2018 10:50:24] "GET / HTTP/1.1" 200 -
Error loading state: AccessDenied: Access Denied
status code: 403, request id: F5D440E18F1778DA, host id: hWAk0q67MYM+a7gao50Ytkw4+b0s8jPfeFZl7CEbmOIyU4EavpMuLxf7pNJzYra3sSCmApBQxwA=
[2018-11-28 10:50:27,048] ERROR in app: Exception on /graph.svg [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.7/site-packages/blastradius/server/server.py", line 32, in graph_svg
dot = DotGraph('', file_contents=run_tf_graph())
File "/usr/local/lib/python3.7/site-packages/blastradius/server/server.py", line 71, in run_tf_graph
raise
RuntimeError: No active exception to reraise
127.0.0.1 - - [28/Nov/2018 10:50:27] "GET /graph.svg HTTP/1.1" 500 -
Any Hints?
To support windows :
In server.py just change a few lines:
def index():
# we need terraform, graphviz, and an init-ed terraform project.
if not which('terraform') or not which('dot'):
if not which('terraform.exe') or not which('dot.exe'):
return render_template('error.html')
if not os.path.exists('.terraform'):
return render_template('error.html')
The display of complex graphs quickly becomes confusing, especially when modules are used. Terraform itself supports a --module-depth
option, that eliminate the display of deeply nested modules.
This ticket proposes several mechanisms for simplifying the display of these graphs.
--module-depth
-- the same as Terraform--focus
-- present only a given node and its dependencies.--center
-- same as --focus
but also include nodes that depend on the given node.Use collections in Python 2 and collections.abc in Python 3.
blast-radius/blastradius/util.py
Line 65 in 4b07f64
@brogersyh -- just merged your changes from #6 . Really wonderful stuff. I'm a faltering and infrequent user of docker
, but managed to upload to the docker hub under 28mm/blast-radius
, and will make this part of the release process.
Cutting an issue for discussion.
docker-entrypoint.sh
runs terraform init
. If a .terraform
directory already maybe it should run terraform get
, instead?Anyway, would be glad to have your thoughts, and happy new years ๐ฅ
Blast Radius fresh install on ubuntu is failing to execute.
terraform-repo >pip install BlastRadius --no-cache-dir 16:41:19
Collecting BlastRadius
Downloading BlastRadius-0.1.10.tar.gz (560kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 563kB 772kB/s
Collecting BeautifulSoup4 (from BlastRadius)
Downloading beautifulsoup4-4.6.0-py2-none-any.whl (86kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 92kB 1.1MB/s
Collecting Flask (from BlastRadius)
Downloading Flask-0.12.2-py2.py3-none-any.whl (83kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 92kB 959kB/s
Collecting jinja2 (from BlastRadius)
Downloading Jinja2-2.10-py2.py3-none-any.whl (126kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 133kB 996kB/s
Collecting pyhcl (from BlastRadius)
Downloading pyhcl-0.3.9.tar.gz
Collecting requests (from BlastRadius)
Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 92kB 1.3MB/s
Collecting itsdangerous>=0.21 (from Flask->BlastRadius)
Downloading itsdangerous-0.24.tar.gz (46kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 51kB 1.5MB/s
Collecting Werkzeug>=0.7 (from Flask->BlastRadius)
Downloading Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 327kB 976kB/s
Collecting click>=2.0 (from Flask->BlastRadius)
Downloading click-6.7-py2.py3-none-any.whl (71kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 71kB 1.2MB/s
Collecting MarkupSafe>=0.23 (from jinja2->BlastRadius)
Downloading MarkupSafe-1.0.tar.gz
Collecting ply==3.10 (from pyhcl->BlastRadius)
Downloading ply-3.10.tar.gz (150kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 153kB 988kB/s
Collecting idna<2.7,>=2.5 (from requests->BlastRadius)
Downloading idna-2.6-py2.py3-none-any.whl (56kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 61kB 1.4MB/s
Collecting urllib3<1.23,>=1.21.1 (from requests->BlastRadius)
Downloading urllib3-1.22-py2.py3-none-any.whl (132kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 133kB 1.2MB/s
Collecting certifi>=2017.4.17 (from requests->BlastRadius)
Downloading certifi-2018.1.18-py2.py3-none-any.whl (151kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 153kB 1.1MB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests->BlastRadius)
Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
100% |โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 143kB 1.4MB/s
Installing collected packages: BeautifulSoup4, itsdangerous, MarkupSafe, jinja2, Werkzeug, click, Flask, ply, pyhcl, idna, urllib3, certifi, chardet, requests, BlastRadius
Running setup.py install for itsdangerous ... done
Running setup.py install for MarkupSafe ... done
Running setup.py install for ply ... done
Running setup.py install for pyhcl ... done
Running setup.py install for BlastRadius ... done
Successfully installed BeautifulSoup4-4.6.0 BlastRadius-0.1.10 Flask-0.12.2 MarkupSafe-1.0 Werkzeug-0.14.1 certifi-2018.1.18 chardet-3.0.4 click-6.7 idna-2.6 itsdangerous-0.24 jinja2-2.10 ply-3.10 pyhcl-0.3.9 requests-2.18.4 urllib3-1.22
user >cd Documents/Work/terraform-repo/ 16:36:15
terraform-repo >blast-radius --serve . 16:36:18
Traceback (most recent call last):
File "/usr/bin/blast-radius", line 14, in <module>
from blastradius.handlers.dot import DotGraph, Format, DotNode
File "/home/user/.local/lib/python2.7/site-packages/blastradius/handlers/dot.py", line 391
print('Error processing format param: ' + 'p', file=sys.stderr)
^
SyntaxError: invalid syntax
terraform-repo >pip --version 16:36:26
ppip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
terraform-repo >python --version 16:38:01
Python 2.7.14
terraform-repo >lsb_release -a 16:38:02
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 17.10
Release: 17.10
Codename: artful
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.