├── .coveragerc ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .gitreview ├── .zuul.yaml ├── CONTRIBUTING.rst ├── HACKING.rst ├── LICENSE ├── MANIFEST.in ├── README.rst ├── babel-django.cfg ├── babel-djangojs.cfg ├── bindep.txt ├── devstack ├── plugin.sh └── settings ├── doc ├── requirements.txt └── source │ ├── conf.py │ ├── configuration │ ├── configuration.rst │ └── index.rst │ ├── contributor │ ├── contributing.rst │ ├── devstack.rst │ └── index.rst │ ├── index.rst │ ├── install │ └── index.rst │ └── user │ ├── index.rst │ ├── stacks.rst │ └── template_generator.rst ├── heat_dashboard ├── __init__.py ├── api │ ├── __init__.py │ ├── heat.py │ └── rest │ │ ├── __init__.py │ │ └── heat.py ├── conf │ ├── default_policies │ │ └── heat.yaml │ └── heat_policy.yaml ├── content │ ├── __init__.py │ ├── resource_types │ │ ├── __init__.py │ │ ├── panel.py │ │ ├── tables.py │ │ ├── tabs.py │ │ ├── templates │ │ │ ├── resource_types │ │ │ │ └── _details.html │ │ │ └── stacks.resource_types │ │ │ │ └── _details.html │ │ ├── urls.py │ │ └── views.py │ ├── stacks │ │ ├── __init__.py │ │ ├── api.py │ │ ├── forms.py │ │ ├── mappings.py │ │ ├── panel.py │ │ ├── sro.py │ │ ├── tables.py │ │ ├── tabs.py │ │ ├── templates │ │ │ └── stacks │ │ │ │ ├── _change_template.html │ │ │ │ ├── _create.html │ │ │ │ ├── _detail_events.html │ │ │ │ ├── _detail_overview.html │ │ │ │ ├── _detail_resources.html │ │ │ │ ├── _detail_topology.html │ │ │ │ ├── _preview.html │ │ │ │ ├── _preview_details.html │ │ │ │ ├── _preview_template.html │ │ │ │ ├── _resource_info.html │ │ │ │ ├── _resource_overview.html │ │ │ │ ├── _select_template.html │ │ │ │ ├── _stack_info.html │ │ │ │ ├── _stack_template.html │ │ │ │ ├── _update.html │ │ │ │ ├── change_template.html │ │ │ │ ├── create.html │ │ │ │ ├── index.html │ │ │ │ ├── preview.html │ │ │ │ ├── preview_details.html │ │ │ │ ├── preview_template.html │ │ │ │ ├── select_template.html │ │ │ │ └── update.html │ │ ├── urls.py │ │ └── views.py │ ├── template_generator │ │ ├── __init__.py │ │ ├── api.py │ │ ├── panel.py │ │ ├── templates │ │ │ └── template_generator │ │ │ │ └── index.html │ │ ├── urls.py │ │ └── views.py │ └── template_versions │ │ ├── __init__.py │ │ ├── panel.py │ │ ├── tables.py │ │ ├── tabs.py │ │ ├── templates │ │ ├── stacks.template_versions │ │ │ ├── _details.html │ │ │ └── index.html │ │ └── template_versions │ │ │ ├── _details.html │ │ │ └── index.html │ │ ├── urls.py │ │ └── views.py ├── enabled │ ├── _1610_project_orchestration_panel.py │ ├── _1620_project_stacks_panel.py │ ├── _1630_project_resource_types_panel.py │ ├── _1640_project_template_versions_panel.py │ ├── _1650_project_template_generator_panel.py │ └── __init__.py ├── exceptions.py ├── local_settings.d │ ├── _1699_orchestration_settings.py │ └── __init__.py ├── locale │ ├── cs │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── de │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── en_AU │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── en_GB │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── es │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── id │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── it │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── ja │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── ko_KR │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── ne │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── pl_PL │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ ├── django.po │ │ │ └── djangojs.po │ ├── tr_TR │ │ └── LC_MESSAGES │ │ │ └── django.po │ └── zh_Hans │ │ └── LC_MESSAGES │ │ ├── django.po │ │ └── djangojs.po ├── static │ └── dashboard │ │ └── project │ │ └── heat_dashboard │ │ ├── img │ │ ├── alarm-gray.gif │ │ ├── alarm-gray.svg │ │ ├── alarm-green.svg │ │ ├── alarm-red.svg │ │ ├── apple-touch-icon.png │ │ ├── config-gray.gif │ │ ├── config-gray.svg │ │ ├── config-green.svg │ │ ├── config-red.svg │ │ ├── db-gray.gif │ │ ├── db-gray.svg │ │ ├── db-green.svg │ │ ├── db-red.svg │ │ ├── drag.png │ │ ├── favicon.ico │ │ ├── firewall-gray.gif │ │ ├── firewall-gray.svg │ │ ├── firewall-green.svg │ │ ├── firewall-red.svg │ │ ├── flavor-gray.gif │ │ ├── flavor-gray.svg │ │ ├── flavor-green.svg │ │ ├── flavor-red.svg │ │ ├── floatingip-gray.gif │ │ ├── floatingip-gray.svg │ │ ├── floatingip-green.svg │ │ ├── floatingip-red.svg │ │ ├── image-gray.gif │ │ ├── image-gray.svg │ │ ├── image-green.svg │ │ ├── image-red.svg │ │ ├── keypair-gray.gif │ │ ├── keypair-gray.svg │ │ ├── keypair-green.svg │ │ ├── keypair-red.svg │ │ ├── lb-gray.gif │ │ ├── lb-gray.svg │ │ ├── lb-green.svg │ │ ├── lb-red.svg │ │ ├── logo-splash.svg │ │ ├── logo.svg │ │ ├── network-gray.gif │ │ ├── network-gray.svg │ │ ├── network-green.svg │ │ ├── network-red.svg │ │ ├── policy-gray.gif │ │ ├── policy-gray.svg │ │ ├── policy-green.svg │ │ ├── policy-red.svg │ │ ├── port-gray.gif │ │ ├── port-gray.svg │ │ ├── port-green.svg │ │ ├── port-red.svg │ │ ├── router-gray.gif │ │ ├── router-gray.svg │ │ ├── router-green.svg │ │ ├── router-red.svg │ │ ├── safari-pinned-tab.svg │ │ ├── securitygroup-gray.gif │ │ ├── securitygroup-gray.svg │ │ ├── securitygroup-green.svg │ │ ├── securitygroup-red.svg │ │ ├── server-gray.gif │ │ ├── server-gray.svg │ │ ├── server-green.svg │ │ ├── server-red.svg │ │ ├── spinner.gif │ │ ├── stack-gray.gif │ │ ├── stack-gray.svg │ │ ├── stack-green.svg │ │ ├── stack-red.svg │ │ ├── unknown-gray.gif │ │ ├── unknown-gray.svg │ │ ├── unknown-green.svg │ │ ├── unknown-red.svg │ │ ├── volume-gray.gif │ │ ├── volume-gray.svg │ │ ├── volume-green.svg │ │ ├── volume-red.svg │ │ ├── vpn-gray.svg │ │ ├── vpn-green.svg │ │ ├── vpn-red.svg │ │ ├── vpn.gif │ │ ├── wait-gray.gif │ │ ├── wait-gray.svg │ │ ├── wait-green.svg │ │ └── wait-red.svg │ │ ├── stacks │ │ └── actions │ │ │ ├── actions-checked-selected.template.html │ │ │ ├── check.service.js │ │ │ ├── create.service.js │ │ │ └── delete.service.js │ │ └── template_generator │ │ ├── css │ │ ├── angular-material.scss │ │ ├── angular-notify.scss │ │ ├── hotgen-main.scss │ │ ├── hotgen.scss │ │ ├── img │ │ │ └── icons │ │ │ │ ├── file-text-o.svg │ │ │ │ ├── floppy-o.svg │ │ │ │ ├── ic_close_24px.svg │ │ │ │ ├── ic_help_outline_24px.svg │ │ │ │ ├── spinner.svg │ │ │ │ ├── trash.svg │ │ │ │ ├── unknown-gray.svg │ │ │ │ ├── unknown-green.svg │ │ │ │ ├── unknown-red.svg │ │ │ │ └── unknown.svg │ │ └── vis.scss │ │ ├── js │ │ ├── components │ │ │ ├── agent.controller.js │ │ │ ├── agent.controller.spec.js │ │ │ ├── agent.module.js │ │ │ ├── agent.module.spec.js │ │ │ ├── compile.directive.js │ │ │ ├── compile.directive.spec.js │ │ │ ├── dependson.directive.js │ │ │ ├── dependson.directive.spec.js │ │ │ ├── draggable.directive.js │ │ │ ├── draggable.directive.spec.js │ │ │ ├── droppable.directive.js │ │ │ ├── droppable.directive.spec.js │ │ │ ├── globals.service.js │ │ │ ├── globals.service.spec.js │ │ │ ├── icons.controller.js │ │ │ ├── icons.controller.spec.js │ │ │ ├── loading.controller.js │ │ │ ├── loading.controller.spec.js │ │ │ ├── menu.controller.js │ │ │ ├── menu.controller.spec.js │ │ │ ├── modal-draft.controller.js │ │ │ ├── modal-draft.controller.spec.js │ │ │ ├── modal-edge.controller.js │ │ │ ├── modal-edge.controller.spec.js │ │ │ ├── modal-node.controller.js │ │ │ ├── modal-node.controller.spec.js │ │ │ ├── modal-template.controller.js │ │ │ ├── modal-template.controller.spec.js │ │ │ ├── states.service.js │ │ │ ├── states.service.spec.js │ │ │ ├── template-generator.module.js │ │ │ ├── template-generator.module.spec.js │ │ │ ├── utils.module.js │ │ │ ├── utils.module.spec.js │ │ │ ├── vis-network.controller.js │ │ │ └── vis-network.controller.spec.js │ │ ├── libs │ │ │ ├── angular-material.js │ │ │ ├── angular-notify.js │ │ │ └── vis.js │ │ └── resources │ │ │ ├── os__cinder__volume │ │ │ ├── os__cinder__volume-blue.svg │ │ │ ├── os__cinder__volume-gray.svg │ │ │ ├── os__cinder__volume-green.svg │ │ │ ├── os__cinder__volume-red.svg │ │ │ ├── os__cinder__volume.html │ │ │ ├── os__cinder__volume.js │ │ │ ├── os__cinder__volume.spec.js │ │ │ └── os__cinder__volume.svg │ │ │ ├── os__cinder__volumeattachment │ │ │ ├── os__cinder__volumeattachment-blue.svg │ │ │ ├── os__cinder__volumeattachment-gray.svg │ │ │ ├── os__cinder__volumeattachment-green.svg │ │ │ ├── os__cinder__volumeattachment-red.svg │ │ │ ├── os__cinder__volumeattachment.html │ │ │ ├── os__cinder__volumeattachment.js │ │ │ ├── os__cinder__volumeattachment.spec.js │ │ │ └── os__cinder__volumeattachment.svg │ │ │ ├── os__designate__recordset │ │ │ ├── os__designate__recordset-blue.svg │ │ │ ├── os__designate__recordset-gray.svg │ │ │ ├── os__designate__recordset-green.svg │ │ │ ├── os__designate__recordset-red.svg │ │ │ ├── os__designate__recordset.html │ │ │ ├── os__designate__recordset.js │ │ │ ├── os__designate__recordset.spec.js │ │ │ └── os__designate__recordset.svg │ │ │ ├── os__designate__zone │ │ │ ├── os__designate__zone-blue.svg │ │ │ ├── os__designate__zone-gray.svg │ │ │ ├── os__designate__zone-green.svg │ │ │ ├── os__designate__zone-red.svg │ │ │ ├── os__designate__zone.html │ │ │ ├── os__designate__zone.js │ │ │ ├── os__designate__zone.spec.js │ │ │ └── os__designate__zone.svg │ │ │ ├── os__heat__autoscalinggroup │ │ │ ├── os__heat__autoscalinggroup-blue.svg │ │ │ ├── os__heat__autoscalinggroup-gray.svg │ │ │ ├── os__heat__autoscalinggroup-green.svg │ │ │ ├── os__heat__autoscalinggroup-red.svg │ │ │ ├── os__heat__autoscalinggroup.html │ │ │ ├── os__heat__autoscalinggroup.js │ │ │ ├── os__heat__autoscalinggroup.spec.js │ │ │ └── os__heat__autoscalinggroup.svg │ │ │ ├── os__heat__resourcegroup │ │ │ ├── os__heat__resourcegroup-blue.svg │ │ │ ├── os__heat__resourcegroup-gray.svg │ │ │ ├── os__heat__resourcegroup-green.svg │ │ │ ├── os__heat__resourcegroup-red.svg │ │ │ ├── os__heat__resourcegroup.html │ │ │ ├── os__heat__resourcegroup.js │ │ │ ├── os__heat__resourcegroup.spec.js │ │ │ └── os__heat__resourcegroup.svg │ │ │ ├── os__heat__scalingpolicy │ │ │ ├── os__heat__scalingpolicy-blue.svg │ │ │ ├── os__heat__scalingpolicy-gray.svg │ │ │ ├── os__heat__scalingpolicy-green.svg │ │ │ ├── os__heat__scalingpolicy-red.svg │ │ │ ├── os__heat__scalingpolicy.html │ │ │ ├── os__heat__scalingpolicy.js │ │ │ ├── os__heat__scalingpolicy.spec.js │ │ │ └── os__heat__scalingpolicy.svg │ │ │ ├── os__neutron__floatingip │ │ │ ├── os__neutron__floatingip-blue.svg │ │ │ ├── os__neutron__floatingip-gray.svg │ │ │ ├── os__neutron__floatingip-green.svg │ │ │ ├── os__neutron__floatingip-red.svg │ │ │ ├── os__neutron__floatingip.html │ │ │ ├── os__neutron__floatingip.js │ │ │ ├── os__neutron__floatingip.spec.js │ │ │ └── os__neutron__floatingip.svg │ │ │ ├── os__neutron__floatingipassociation │ │ │ ├── os__neutron__floatingassociation.spec.js │ │ │ ├── os__neutron__floatingipassociation-blue.svg │ │ │ ├── os__neutron__floatingipassociation-gray.svg │ │ │ ├── os__neutron__floatingipassociation-green.svg │ │ │ ├── os__neutron__floatingipassociation-red.svg │ │ │ ├── os__neutron__floatingipassociation.html │ │ │ ├── os__neutron__floatingipassociation.js │ │ │ └── os__neutron__floatingipassociation.svg │ │ │ ├── os__neutron__net │ │ │ ├── os__neutron__net-blue.svg │ │ │ ├── os__neutron__net-gray.svg │ │ │ ├── os__neutron__net-green.svg │ │ │ ├── os__neutron__net-red.svg │ │ │ ├── os__neutron__net.html │ │ │ ├── os__neutron__net.js │ │ │ ├── os__neutron__net.spec.js │ │ │ └── os__neutron__net.svg │ │ │ ├── os__neutron__port │ │ │ ├── os__neutron__port-blue.svg │ │ │ ├── os__neutron__port-gray.svg │ │ │ ├── os__neutron__port-green.svg │ │ │ ├── os__neutron__port-red.svg │ │ │ ├── os__neutron__port.html │ │ │ ├── os__neutron__port.js │ │ │ ├── os__neutron__port.spec.js │ │ │ └── os__neutron__port.svg │ │ │ ├── os__neutron__router │ │ │ ├── os__neutron__router-blue.svg │ │ │ ├── os__neutron__router-gray.svg │ │ │ ├── os__neutron__router-green.svg │ │ │ ├── os__neutron__router-red.svg │ │ │ ├── os__neutron__router.html │ │ │ ├── os__neutron__router.js │ │ │ ├── os__neutron__router.spec.js │ │ │ └── os__neutron__router.svg │ │ │ ├── os__neutron__routerinterface │ │ │ ├── os__neutron__routerinterface-blue.svg │ │ │ ├── os__neutron__routerinterface-gray.svg │ │ │ ├── os__neutron__routerinterface-green.svg │ │ │ ├── os__neutron__routerinterface-red.svg │ │ │ ├── os__neutron__routerinterface.html │ │ │ ├── os__neutron__routerinterface.js │ │ │ ├── os__neutron__routerinterface.spec.js │ │ │ └── os__neutron__routerinterface.svg │ │ │ ├── os__neutron__securitygroup │ │ │ ├── os__neutron__securitygroup-blue.svg │ │ │ ├── os__neutron__securitygroup-gray.svg │ │ │ ├── os__neutron__securitygroup-green.svg │ │ │ ├── os__neutron__securitygroup-red.svg │ │ │ ├── os__neutron__securitygroup.html │ │ │ ├── os__neutron__securitygroup.js │ │ │ ├── os__neutron__securitygroup.spec.js │ │ │ └── os__neutron__securitygroup.svg │ │ │ ├── os__neutron__subnet │ │ │ ├── os__neutron__subnet-blue.svg │ │ │ ├── os__neutron__subnet-gray.svg │ │ │ ├── os__neutron__subnet-green.svg │ │ │ ├── os__neutron__subnet-red.svg │ │ │ ├── os__neutron__subnet.html │ │ │ ├── os__neutron__subnet.js │ │ │ ├── os__neutron__subnet.spec.js │ │ │ └── os__neutron__subnet.svg │ │ │ ├── os__nova__keypair │ │ │ ├── os__nova__keypair-blue.svg │ │ │ ├── os__nova__keypair-gray.svg │ │ │ ├── os__nova__keypair-green.svg │ │ │ ├── os__nova__keypair-red.svg │ │ │ ├── os__nova__keypair.html │ │ │ ├── os__nova__keypair.js │ │ │ ├── os__nova__keypair.spec.js │ │ │ └── os__nova__keypair.svg │ │ │ ├── os__nova__server │ │ │ ├── os__nova__server-blue.svg │ │ │ ├── os__nova__server-gray.svg │ │ │ ├── os__nova__server-green.svg │ │ │ ├── os__nova__server-red.svg │ │ │ ├── os__nova__server.html │ │ │ ├── os__nova__server.js │ │ │ ├── os__nova__server.spec.js │ │ │ └── os__nova__server.svg │ │ │ └── os__swift__container │ │ │ ├── os__swift__container-blue.svg │ │ │ ├── os__swift__container-gray.svg │ │ │ ├── os__swift__container-green.svg │ │ │ ├── os__swift__container-red.svg │ │ │ ├── os__swift__container.html │ │ │ ├── os__swift__container.js │ │ │ ├── os__swift__container.spec.js │ │ │ └── os__swift__container.svg │ │ └── templates │ │ ├── depends_on.html │ │ ├── modal_draft.html │ │ ├── modal_edge.html │ │ ├── modal_resource.html │ │ └── modal_template.html └── test │ ├── __init__.py │ ├── helpers.py │ ├── integration │ ├── __init__.py │ ├── horizon.conf │ ├── pages │ │ ├── __init__.py │ │ └── project │ │ │ ├── __init__.py │ │ │ └── orchestration │ │ │ ├── __init__.py │ │ │ ├── resourcetypespage.py │ │ │ ├── stackspage.py │ │ │ ├── templategeneratorpage.py │ │ │ └── templateversionspage.py │ └── test_basic.py │ ├── settings.py │ ├── test_data │ ├── __init__.py │ ├── cinder_data.py │ ├── exceptions.py │ ├── glance_data.py │ ├── heat_data.py │ ├── keystone_data.py │ ├── neutron_data.py │ ├── nova_data.py │ └── utils.py │ └── tests │ ├── __init__.py │ ├── api │ ├── __init__.py │ ├── test_heat.py │ └── test_heat_rest.py │ └── content │ ├── __init__.py │ ├── test_resource_types.py │ ├── test_stacks.py │ ├── test_template_generator.py │ └── test_template_versions.py ├── karma.conf.js ├── manage.py ├── package.json ├── pyproject.toml ├── releasenotes ├── notes │ ├── .placeholder │ ├── drop-py-2-7-3dafc6e9e6f29bda.yaml │ ├── drop-python-3-6-and-3-7-b7319859be66ed72.yaml │ ├── drop-python-3-8-2a8b6960c0ce7850.yaml │ ├── enabled_file_for_tmplgen-71432805cbfe4176.yaml │ ├── policy-in-code-support-42c02d6b73e770ff.yaml │ ├── split-out-from-horizon-1d1eabed58eb885e.yaml │ └── template-generator-panel-decc3ec172bfa1dd.yaml └── source │ ├── 2023.1.rst │ ├── 2023.2.rst │ ├── 2024.1.rst │ ├── 2024.2.rst │ ├── 2025.1.rst │ ├── _static │ └── .placeholder │ ├── _templates │ └── .placeholder │ ├── conf.py │ ├── index.rst │ ├── locale │ ├── cs │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── de │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── en_GB │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── es │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── id │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── ja │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── ko_KR │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── ne │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ └── releasenotes.po │ └── zh_CN │ │ └── LC_MESSAGES │ │ └── releasenotes.po │ ├── queens.rst │ ├── rocky.rst │ ├── stein.rst │ ├── train.rst │ ├── unreleased.rst │ ├── ussuri.rst │ ├── victoria.rst │ ├── wallaby.rst │ ├── xena.rst │ ├── yoga.rst │ └── zed.rst ├── requirements.txt ├── setup.cfg ├── setup.py ├── test-requirements.txt └── tox.ini /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | branch = True 3 | source = heat_dashboard 4 | omit = heat_dashboard/tests/* 5 | 6 | [report] 7 | ignore_errors = True 8 | 9 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/libs/* 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | AUTHORS 28 | ChangeLog 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | .tox/ 42 | .coverage 43 | .coverage.* 44 | cover 45 | .cache 46 | nosetests.xml 47 | *.cover 48 | .hypothesis/ 49 | ut_*_nose_results.html 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # dotenv 85 | .env 86 | 87 | # virtualenv 88 | .venv 89 | venv/ 90 | ENV/ 91 | 92 | # Spyder project settings 93 | .spyderproject 94 | .spyproject 95 | 96 | # Rope project settings 97 | .ropeproject 98 | 99 | # mkdocs documentation 100 | /site 101 | 102 | # mypy 103 | .mypy_cache/ 104 | 105 | # own settings 106 | .idea/* 107 | .vscode/* 108 | 109 | # angular old versions 110 | *angular-1.3.7* 111 | *angular-1.5.6* 112 | 113 | # backup files 114 | *.bak 115 | 116 | coverage/* 117 | node_modules/* 118 | package-lock.json 119 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=review.opendev.org 3 | port=29418 4 | project=openstack/heat-dashboard.git 5 | defaultbranch=master 6 | -------------------------------------------------------------------------------- /.zuul.yaml: -------------------------------------------------------------------------------- 1 | - job: 2 | name: heat-dashboard-integration-tests 3 | parent: horizon-integration-tests 4 | required-projects: 5 | - name: openstack/horizon 6 | - name: openstack/heat 7 | - name: openstack/python-heatclient 8 | - name: openstack/heat-dashboard 9 | roles: 10 | - zuul: openstack-infra/devstack 11 | - zuul: openstack/horizon 12 | irrelevant-files: 13 | - ^.*\.rst$ 14 | - ^doc/.*$ 15 | - ^releasenotes/.*$ 16 | vars: 17 | devstack_plugins: 18 | heat: https://opendev.org/openstack/heat 19 | heat-dashboard: https://opendev.org/openstack/heat-dashboard 20 | devstack_services: 21 | horizon: true 22 | tox_envlist: integration 23 | 24 | - project: 25 | templates: 26 | - check-requirements 27 | - horizon-non-primary-django-jobs 28 | - horizon-nodejs-jobs 29 | - openstack-python3-jobs-horizon 30 | - publish-openstack-docs-pti 31 | - release-notes-jobs-python3 32 | check: 33 | jobs: 34 | - heat-dashboard-integration-tests: 35 | voting: false 36 | -------------------------------------------------------------------------------- /CONTRIBUTING.rst: -------------------------------------------------------------------------------- 1 | The source repository for this project can be found at: 2 | 3 | https://opendev.org/openstack/heat-dashboard 4 | 5 | Pull requests submitted through GitHub are not monitored. 6 | 7 | To start contributing to OpenStack, follow the steps in the contribution guide 8 | to set up and use Gerrit: 9 | 10 | https://docs.openstack.org/contributors/code-and-documentation/quick-start.html 11 | 12 | Bugs should be filed on Storyboard,: 13 | 14 | https://storyboard.openstack.org/#!/project/openstack/heat-dashboard 15 | 16 | For more specific information about contributing to this repository, see the 17 | heat-dashboard contributor guide: 18 | 19 | https://docs.openstack.org/heat-dashboard/latest/contributor/contributing.html 20 | -------------------------------------------------------------------------------- /HACKING.rst: -------------------------------------------------------------------------------- 1 | openstack Style Commandments 2 | =============================================== 3 | 4 | Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/ 5 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include heat_dashboard *.html *.scss *.css *.js *.map *.svg *.png *.json 2 | 3 | include AUTHORS 4 | include ChangeLog 5 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ========================== 2 | Welcome to Heat Dashboard! 3 | ========================== 4 | 5 | Heat dashboard is a horizon plugin for Heat. 6 | 7 | * License: Apache license 8 | * Documentation: https://docs.openstack.org/heat-dashboard/latest/ 9 | * Source: https://opendev.org/openstack/heat-dashboard 10 | * Bugs: https://storyboard.openstack.org/#!/project/openstack/heat-dashboard 11 | * Release Notes: https://docs.openstack.org/releasenotes/heat-dashboard 12 | 13 | Team and repository tags 14 | ------------------------ 15 | 16 | .. image:: https://governance.openstack.org/tc/badges/heat-dashboard.svg 17 | :target: https://governance.openstack.org/tc/reference/tags/index.html 18 | -------------------------------------------------------------------------------- /babel-django.cfg: -------------------------------------------------------------------------------- 1 | [python: **.py] 2 | [django: **/templates/**.html] 3 | [django: **/templates/**.csv] 4 | -------------------------------------------------------------------------------- /babel-djangojs.cfg: -------------------------------------------------------------------------------- 1 | [javascript: **.js] 2 | [angular: **/static/**.html] 3 | -------------------------------------------------------------------------------- /bindep.txt: -------------------------------------------------------------------------------- 1 | # This is a cross-platform list tracking distribution packages needed for install and tests; 2 | # see https://docs.openstack.org/infra/bindep/ for additional information. 3 | 4 | libffi-dev [platform:dpkg test] 5 | libffi-devel [platform:rpm test] 6 | 7 | # selenium tests 8 | firefox [selenium platform:ubuntu] 9 | firefox-esr [selenium platform:debian] 10 | xvfb [selenium platform:dpkg] 11 | # already part of xorg-x11-server on openSUSE 12 | xorg-x11-server-Xvfb [selenium platform:redhat] 13 | -------------------------------------------------------------------------------- /devstack/settings: -------------------------------------------------------------------------------- 1 | # settings file for heat-dashboard plugin 2 | enable_service heat-dashboard 3 | -------------------------------------------------------------------------------- /doc/requirements.txt: -------------------------------------------------------------------------------- 1 | openstackdocstheme>=2.2.1 # Apache-2.0 2 | sphinx>=2.0.0 # BSD 3 | reno>=3.1.0 # Apache-2.0 4 | sphinxcontrib-httpdomain>=1.3.0 # BSD 5 | sphinxcontrib-svg2pdfconverter>=0.1.0 # BSD 6 | -------------------------------------------------------------------------------- /doc/source/configuration/configuration.rst: -------------------------------------------------------------------------------- 1 | ============= 2 | Configuration 3 | ============= 4 | 5 | Heat Dashboard has configuration option as below. 6 | 7 | For more configurations, see 8 | `Configuration Guide `_ 9 | in the Horizon documentation. 10 | 11 | OPENSTACK_HEAT_STACK 12 | ~~~~~~~~~~~~~~~~~~~~ 13 | 14 | .. versionadded:: 9.0.0(Mitaka) 15 | 16 | Default: 17 | 18 | .. code-block:: python 19 | 20 | { 21 | 'enable_user_pass': True 22 | } 23 | 24 | A dictionary of settings to use with heat stacks. Currently, the only setting 25 | available is "enable_user_pass", which can be used to disable the password 26 | field while launching the stack. Currently HEAT API needs user password to 27 | perform all the heat operations because in HEAT API trusts is not enabled by 28 | default. So, this setting can be set as "False" in-case HEAT uses trusts by 29 | default otherwise it needs to be set as "True". 30 | -------------------------------------------------------------------------------- /doc/source/configuration/index.rst: -------------------------------------------------------------------------------- 1 | ================================== 2 | Heat Dashboard configuration guide 3 | ================================== 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | configuration 9 | -------------------------------------------------------------------------------- /doc/source/contributor/contributing.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | So You Want to Contribute... 3 | ============================ 4 | For general information on contributing to OpenStack, please check out the 5 | `contributor guide `_ to get started. 6 | It covers all the basics that are common to all OpenStack projects: the accounts 7 | you need, the basics of interacting with our Gerrit review system, how we 8 | communicate as a community, etc. 9 | Below will cover the more project specific information you need to get started 10 | with heat-dashboard. 11 | 12 | Communication 13 | ~~~~~~~~~~~~~ 14 | * IRC channel #heat at OFTC 15 | * Mailing list (prefix subjects with ``[heat]`` for faster responses) 16 | http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss 17 | 18 | Contacting the Core Team 19 | ~~~~~~~~~~~~~~~~~~~~~~~~ 20 | Please refer the `heat-dashboard Core Team 21 | `_ contacts. 22 | 23 | New Feature Planning 24 | ~~~~~~~~~~~~~~~~~~~~ 25 | heat-dashboard features are tracked on `Storyboard `_. 26 | 27 | Task Tracking 28 | ~~~~~~~~~~~~~ 29 | We track our tasks in `Storyboard `_. 30 | If you're looking for some smaller, easier work item to pick up and get started 31 | on, search for the 'low-hanging-fruit' tag. 32 | 33 | Reporting a Bug 34 | ~~~~~~~~~~~~~~~ 35 | You found an issue and want to make sure we are aware of it? You can do so on 36 | `Storyboard `_. 37 | 38 | Getting Your Patch Merged 39 | ~~~~~~~~~~~~~~~~~~~~~~~~~ 40 | All changes proposed to the heat-dashboard project require one or two +2 votes 41 | from heat-dashboard core reviewers before one of the core reviewers can approve 42 | patch by giving ``Workflow +1`` vote. 43 | 44 | Project Team Lead Duties 45 | ~~~~~~~~~~~~~~~~~~~~~~~~ 46 | All common PTL duties are enumerated in the `PTL guide 47 | `_. 48 | -------------------------------------------------------------------------------- /doc/source/contributor/devstack.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Use Heat Dashboard in DevStack 3 | ============================== 4 | 5 | Set up your ``local.conf`` to enable heat-dashboard:: 6 | 7 | [[local|localrc]] 8 | enable_plugin heat-dashboard https://opendev.org/openstack/heat-dashboard 9 | 10 | 11 | .. note:: 12 | 13 | You also need to install Heat itself into DevStack to use Heat Dashboard. 14 | -------------------------------------------------------------------------------- /doc/source/contributor/index.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | Contributor Documentation 3 | =========================== 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | 8 | contributing 9 | devstack 10 | -------------------------------------------------------------------------------- /doc/source/index.rst: -------------------------------------------------------------------------------- 1 | .. openstack documentation master file, created by 2 | sphinx-quickstart on Tue Jul 9 22:26:36 2013. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | .. the main title comes from README.rst 7 | 8 | .. include:: ../../README.rst 9 | 10 | Contents 11 | -------- 12 | 13 | .. toctree:: 14 | :maxdepth: 2 15 | 16 | Installation Guide 17 | Configuration Guide 18 | User Documentation 19 | contributor/index 20 | 21 | For Contributors 22 | ---------------- 23 | 24 | * If you are a new contributor to heat-dashboard please refer: :doc:`contributor/contributing` 25 | 26 | .. toctree:: 27 | :hidden: 28 | 29 | contributor/contributing 30 | -------------------------------------------------------------------------------- /doc/source/user/index.rst: -------------------------------------------------------------------------------- 1 | ================================= 2 | Heat Dashboard User Documentation 3 | ================================= 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | 8 | stacks.rst 9 | template_generator.rst 10 | -------------------------------------------------------------------------------- /doc/source/user/template_generator.rst: -------------------------------------------------------------------------------- 1 | ====================================== 2 | Generate a Heat Orchestration Template 3 | ====================================== 4 | 5 | Heat Dashboard provides a user-friendly interface to generate 6 | Heat Orchestration templates in a Drag and Drop way. 7 | 8 | 9 | Generate a template 10 | ~~~~~~~~~~~~~~~~~~~ 11 | 12 | #. Log in to the dashboard. 13 | #. On the :guilabel:`Project` tab, open the :guilabel:`Orchestration` 14 | tab and click :guilabel:`Template Generator` category. 15 | #. Wait until the page is completely loaded. It may take several seconds. 16 | #. Click the dropdown menu of Template Version, and choose an 17 | appropriate version. 18 | #. Drag icons of resource types at the top of the page to the central 19 | canvas. 20 | #. Click icons on the canvas to specify properties of resources. 21 | #. Click EDIT button at the top of the canvas, to enable manipulate mode. 22 | #. When in manipulate mode, click on CONNECT button to add an edge between 23 | icons. 24 | #. Click edges to show details of connections. 25 | #. Click the Generate Template button at the top-right of the page and 26 | generated template will be shown in a text box. You can also add 27 | modification to the template here. 28 | #. Click CREATE STACK to jump to continue to :guilabel:`Launch Stack`. 29 | #. Click DOWNLOAD STACK to download the generated template. 30 | #. You can also click the Manage Drafts button at the top-right of the 31 | page, to temporarily save the editing canvas or to load a saved one. 32 | 33 | 34 | Currently Supported resource types 35 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 | 37 | 13 types of resources are supported in the first release of Heat Dashboard. 38 | 39 | #. OS::Cinder::Volume 40 | #. OS::Cinder::VolumeAttachment 41 | #. OS::Heat::ResourceGroup 42 | #. OS::Neutron::FloatingIP 43 | #. OS::Neutron::FloatingIPAssociation 44 | #. OS::Neutron::Net 45 | #. OS::Neutron::Port 46 | #. OS::Neutron::Router 47 | #. OS::Neutron::RouterInterface 48 | #. OS::Neutron::SecurityGroup 49 | #. OS::Neutron::Subnet 50 | #. OS::Nova::KeyPair 51 | #. OS::Nova::Server 52 | -------------------------------------------------------------------------------- /heat_dashboard/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/api/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2012 United States Government as represented by the 2 | # Administrator of the National Aeronautics and Space Administration. 3 | # All Rights Reserved. 4 | # 5 | # Copyright 2012 Nebula, Inc. 6 | # Copyright 2013 Big Switch Networks 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 9 | # not use this file except in compliance with the License. You may obtain 10 | # a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 16 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 17 | # License for the specific language governing permissions and limitations 18 | # under the License. 19 | 20 | """ 21 | Methods and interface objects used to interact with external APIs. 22 | 23 | API method calls return objects that are in many cases objects with 24 | attributes that are direct maps to the data returned from the API http call. 25 | Unfortunately, these objects are also often constructed dynamically, making 26 | it difficult to know what data is available from the API object. Because of 27 | this, all API calls should wrap their returned object in one defined here, 28 | using only explicitly defined attributes and/or methods. 29 | 30 | In other words, Horizon developers not working on openstack_dashboard.api 31 | shouldn't need to understand the finer details of APIs for 32 | Keystone/Nova/Glance/Swift et. al. 33 | """ 34 | from heat_dashboard.api import heat 35 | 36 | 37 | __all__ = [ 38 | "heat", 39 | ] 40 | -------------------------------------------------------------------------------- /heat_dashboard/api/rest/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2014, Rackspace, US, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """This package holds the REST API that supports the Horizon dashboard 15 | Javascript code. 16 | 17 | It is not intended to be used outside of Horizon, and makes no promises of 18 | stability or fitness for purpose outside of that scope. 19 | 20 | It does not promise to adhere to the general OpenStack API Guidelines set out 21 | in https://wiki.openstack.org/wiki/APIChangeGuidelines. 22 | """ 23 | 24 | from heat_dashboard.api.rest import heat 25 | 26 | 27 | __all__ = [ 28 | 'heat', 29 | ] 30 | -------------------------------------------------------------------------------- /heat_dashboard/api/rest/heat.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | # See the License for the specific language governing permissions and 11 | # limitations under the License. 12 | """API for the heat service.""" 13 | 14 | from django.views import generic 15 | 16 | from heat_dashboard import api 17 | 18 | from openstack_dashboard import api as dashboard_api 19 | from openstack_dashboard.api.rest import urls 20 | from openstack_dashboard.api.rest import utils as rest_utils 21 | 22 | 23 | @urls.register 24 | class Validate(generic.View): 25 | """API for validating a template""" 26 | url_regex = r'heat/validate/$' 27 | 28 | @rest_utils.ajax(data_required=True) 29 | def post(self, request): 30 | """Validate a template 31 | 32 | The following parameters may be passed in the POST 33 | application/json object. The parameters are: 34 | request: 35 | 36 | :param template_url: The template to validate 37 | """ 38 | return api.heat.template_validate(request, **(request.DATA)) 39 | 40 | 41 | @urls.register 42 | class Services(generic.View): 43 | """API for heat services.""" 44 | url_regex = r'heat/services/$' 45 | 46 | @rest_utils.ajax() 47 | def get(self, request): 48 | """Get a list of heat services.""" 49 | if dashboard_api.base.is_service_enabled(request, 'orchestration'): 50 | result = api.heat.service_list(request) 51 | return {'items': [u.to_dict() for u in result]} 52 | else: 53 | raise rest_utils.AjaxError(501, '') 54 | -------------------------------------------------------------------------------- /heat_dashboard/content/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/content/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/content/resource_types/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.utils.translation import gettext_lazy as _ 15 | 16 | import horizon 17 | 18 | 19 | class ResourceTypes(horizon.Panel): 20 | name = _("Resource Types") 21 | slug = "resource_types" 22 | permissions = ('openstack.services.orchestration',) 23 | policy_rules = (("orchestration", "stacks:list_resource_types"),) 24 | -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/tables.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.utils.translation import gettext_lazy as _ 15 | 16 | from horizon import tables 17 | 18 | 19 | class ResourceTypesFilterAction(tables.FilterAction): 20 | filter_type = 'server' 21 | filter_choices = (('name', _('Type ='), True, _("Case sensitive")),) 22 | 23 | 24 | class ResourceTypesTable(tables.DataTable): 25 | name = tables.Column("resource_type", 26 | verbose_name=_("Type"), 27 | link="horizon:project:resource_types:details",) 28 | 29 | def get_object_id(self, resource): 30 | return resource.resource_type 31 | 32 | class Meta(object): 33 | name = "resource_types" 34 | verbose_name = _("Resource Types") 35 | table_actions = (ResourceTypesFilterAction,) 36 | multi_select = False 37 | -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/tabs.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.utils.translation import gettext_lazy as _ 15 | 16 | from horizon import tabs 17 | 18 | 19 | class ResourceTypeOverviewTab(tabs.Tab): 20 | name = _("Overview") 21 | slug = "resource_type_overview" 22 | template_name = "project/resource_types/_details.html" 23 | 24 | def get_context_data(self, request): 25 | return {"r_type": self.tab_group.kwargs['rt'], 26 | "r_type_attributes": self.tab_group.kwargs['rt_attributes'], 27 | "r_type_properties": self.tab_group.kwargs['rt_properties']} 28 | 29 | 30 | class ResourceTypeDetailsTabs(tabs.TabGroup): 31 | slug = "resource_type_details" 32 | tabs = (ResourceTypeOverviewTab,) 33 | -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/templates/resource_types/_details.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
4 |
5 |
{{ r_type }}
6 |
7 | 8 |

{% trans "Attributes" %}

9 |
{{ r_type_attributes }}
10 |   
11 | 12 |

{% trans "Properties" %}

13 |
{{ r_type_properties }}
14 |   
15 |
16 | -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/templates/stacks.resource_types/_details.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
4 |
5 |
{{ r_type }}
6 |
7 | 8 |

{% trans "Attributes" %}

9 |
{{ r_type_attributes }}
10 |   
11 | 12 |

{% trans "Properties" %}

13 |
{{ r_type_properties }}
14 |   
15 |
16 | -------------------------------------------------------------------------------- /heat_dashboard/content/resource_types/urls.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.urls import re_path 15 | 16 | from heat_dashboard.content.resource_types import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^$', views.ResourceTypesView.as_view(), name='index'), 20 | re_path(r'^(?P[^/]+)/$', 21 | views.DetailView.as_view(), name='details'), 22 | ] 23 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/content/stacks/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | from django.utils.translation import gettext_lazy as _ 14 | 15 | import horizon 16 | 17 | 18 | class Stacks(horizon.Panel): 19 | name = _("Stacks") 20 | slug = "stacks" 21 | permissions = ('openstack.services.orchestration',) 22 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/sro.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | from django.template.defaultfilters import title 14 | from django.template.loader import render_to_string 15 | 16 | from horizon.utils import filters 17 | 18 | 19 | def stack_info(stack, stack_image): 20 | stack.stack_status_desc = title( 21 | filters.replace_underscores(stack.stack_status)) 22 | if stack.stack_status_reason: 23 | stack.stack_status_reason = title( 24 | filters.replace_underscores(stack.stack_status_reason) 25 | ) 26 | context = {} 27 | context['stack'] = stack 28 | context['stack_image'] = stack_image 29 | return render_to_string('project/stacks/_stack_info.html', 30 | context) 31 | 32 | 33 | def resource_info(resource): 34 | resource.resource_status_desc = title( 35 | filters.replace_underscores(resource.resource_status) 36 | ) 37 | if resource.resource_status_reason: 38 | resource.resource_status_reason = title( 39 | filters.replace_underscores(resource.resource_status_reason) 40 | ) 41 | context = {} 42 | context['resource'] = resource 43 | return render_to_string('project/stacks/_resource_info.html', 44 | context) 45 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_change_template.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal_form.html" %} 2 | {% load i18n %} 3 | {% block form_attrs %}enctype="multipart/form-data"{% endblock %} 4 | {% block modal-body-right %} 5 |

{% trans "Description:" %}

6 |

{% trans "A template is used to automate the deployment of infrastructure, services, and applications." %}

7 |

{% trans "Use one of the available template source options to specify the template to be used in changing this stack." %}

8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_create.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal_form.html" %} 2 | {% load i18n %} 3 | {% block modal-body-right %} 4 |

{% trans "Description:" %}

5 |

{% trans "Create a new stack with the provided values." %}

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_detail_events.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | {{ table.render }} 4 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_detail_overview.html: -------------------------------------------------------------------------------- 1 | {% load i18n sizeformat %} 2 | 3 |
4 |
5 |
{% trans "Name" %}
6 |
{{ stack.stack_name }}
7 |
{% trans "ID" %}
8 |
{{ stack.id }}
9 |
{% trans "Description" %}
10 |
{{ stack.description }}
11 |
12 | 13 |

{% trans "Status" %}

14 |
15 |
16 |
{% trans "Created" %}
17 |
{{ stack.creation_time|parse_isotime|timesince_or_never }}
18 |
{% trans "Last Updated" %}
19 |
{{ stack.updated_time|parse_isotime|timesince_or_never }}
20 |
{% trans "Status" %}
21 |
22 | {% blocktrans with stack_status_title=stack.stack_status|title stack_status_reason=stack.stack_status_reason %}{{ stack_status_title }}: {{ stack_status_reason }}{% endblocktrans %} 23 |
24 |
25 | 26 |

{% trans "Outputs" %}

27 |
28 |
29 | {% for output in stack.outputs %} 30 |
{{ output.output_key }}
31 |
{{ output.description }}
32 |
33 | {{ output.output_value|stack_output }} 34 |
35 | {% endfor %} 36 |
37 | 38 |

{% trans "Stack Parameters" %}

39 |
40 |
41 | {% for key, value in stack.parameters.items %} 42 |
{{ key }}
43 |
{{ value }}
44 | {% endfor %} 45 |
46 | 47 |

{% trans "Launch Parameters" %}

48 |
49 |
50 |
{% trans "Timeout" %}
51 |
{{ stack.timeout_mins }} {% trans "Minutes" %}
52 |
{% trans "Rollback" %}
53 |
{% if stack.disable_rollback %}{% trans "Disabled" %}{% else %}{% trans "Enabled" %}{% endif %}
54 |
55 |
56 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_detail_resources.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | {{ table.render }} 4 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_detail_topology.html: -------------------------------------------------------------------------------- 1 | {% load i18n sizeformat %} 2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
-------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_preview.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal_form.html" %} 2 | {% load i18n %} 3 | {% block modal-body-right %} 4 |

{% trans "Description:" %}

5 |

{% trans "Preview a new stack with the provided values." %}

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_preview_details.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal.html" %} 2 | {% load i18n %} 3 | 4 | {% block modal-header %}{% trans "Stack Preview" %}{% endblock %} 5 | 6 | {% block modal-body %} 7 |
8 |
9 |
10 | {% for key, value in stack_preview.items %} 11 | {% if key != 'parameters' and key != 'resources' and key != 'links' %} 12 |
{{ key }}
13 |
{{ value }}
14 | {% endif %} 15 | {% endfor %} 16 |
17 | 18 | {% if stack_preview.parameters %} 19 |
{% trans "Parameters" %}
20 |
21 |
22 | {% for key, value in stack_preview.parameters.items %} 23 |
{{ key }}
24 |
{{ value }}
25 | {% endfor %} 26 |
27 | {% endif %} 28 | 29 | {% if stack_preview.links %} 30 |
{% trans "Links" %}
31 |
32 | {% for link in stack_preview.links %} 33 |
34 |
{{ link.rel }}
35 |
{{ link.href }}
36 |
37 | {% endfor %} 38 | {% endif %} 39 | 40 | {% if stack_preview.resources %} 41 |
{% trans "Resources" %}
42 | {% for resource in stack_preview.resources %} 43 |
44 |
45 | {% for key, value in resource.items %} 46 |
{{ key }}
47 |
{{ value }}
48 | {% endfor %} 49 |
50 | {% endfor %} 51 | {% endif %} 52 |
53 |
54 | {% endblock %} 55 | 56 | {% block modal-footer %} 57 | {% trans "Close" %} 58 | {% endblock %} 59 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_preview_template.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal_form.html" %} 2 | {% load i18n %} 3 | {% block form_attrs %}enctype="multipart/form-data"{% endblock %} 4 | {% block modal-body-right %} 5 |

{% trans "Description:" %}

6 |

{% trans "Use one of the available template source options to specify the template to be used in previewing this stack." %}

7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_resource_info.html: -------------------------------------------------------------------------------- 1 |

{{ resource.resource_name }}

2 | 3 | {% if resource.resource_status == 'CREATE_FAILED' %} 4 |

{{ resource.resource_status_desc }}

5 |

{{ resource.resource_status_reason }}

6 | {% else %} 7 |

{{ resource.resource_status_desc }}

8 | {% endif %} 9 | 10 |

{{ resource.resource_type }}

-------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_resource_overview.html: -------------------------------------------------------------------------------- 1 | {% load i18n sizeformat %} 2 | 3 |
4 |
5 |
{% trans "Stack Resource ID" %}
6 |
{{ resource.resource_name }}
7 |
{% trans "Resource ID" %}
8 |
9 | {% if resource_url %} 10 | 11 | {{ resource.physical_resource_id }} 12 | 13 | {% else %} 14 | {{ resource.physical_resource_id }} 15 | {% endif %} 16 |
17 |
{% trans "Stack Resource Type" %}
18 |
{{ resource.resource_type }}
19 |
{% trans "Description" %}
20 |
{{ resource.description }}
21 |
22 | 23 |

{% trans "Status" %}

24 |
25 |
26 |
{% trans "Last Updated" %}
27 |
{{ resource.updated_time|parse_isotime|timesince_or_never }}
28 |
{% trans "Status" %}
29 |
30 | {% blocktrans with resource_status=resource.resource_status|title|replace_underscores resource_status_reason=resource.resource_status_reason %}{{ resource_status }}: {{ resource_status_reason }}{% endblocktrans %} 31 |
32 |
33 | 34 |

{% trans "Resource Metadata" %}

35 |
36 |
{{ metadata }}
37 |   
38 |
39 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_select_template.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal_form.html" %} 2 | {% load i18n %} 3 | {% block form_attrs %}enctype="multipart/form-data"{% endblock %} 4 | {% block modal-body-right %} 5 |

{% trans "Description:" %}

6 |

{% trans "A template is used to automate the deployment of infrastructure, services, and applications." %}

7 |

{% trans "Use one of the available template source options to specify the template to be used in creating this stack." %}

8 | 9 | 18 | 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_stack_info.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

{{ stack.stack_name }}

4 |

{{ stack.stack_status_desc }}

5 |
6 |
7 | {% if stack.stack_status == 'CREATE_FAILED' %} 8 |

{{ stack.stack_status_reason }}

9 | {% endif %} 10 | {% for output in stack.outputs %} 11 | {% if output.output_key == 'WebsiteURL' %} 12 | {{ output.description }} 13 | {% endif %} 14 | {% endfor %} 15 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_stack_template.html: -------------------------------------------------------------------------------- 1 | {% load i18n sizeformat %} 2 | 3 |
4 |
{{ stack_template }}
5 |
6 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/_update.html: -------------------------------------------------------------------------------- 1 | {% extends "horizon/common/_modal_form.html" %} 2 | {% load i18n %} 3 | {% block modal-body-right %} 4 |

{% trans "Description:" %}

5 |

{% trans "Update a stack with the provided values. Please note that any encrypted parameters, such as passwords, will be reset to default if you do not change them here." %}

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/change_template.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Change Template" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_change_template.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/create.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Launch Stack" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_create.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{{ page_title }}{% endblock %} 4 | {% block main %}{{ table.render }}{% endblock %} 5 | 6 | {% block js %} 7 | {% include "horizon/_scripts.html" %} 8 | 9 | 18 | {% endblock %} -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/preview.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Preview Stack" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_preview.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/preview_details.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Preview Stack Details" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_preview_details.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/preview_template.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Preview Template" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_preview_template.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/select_template.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Select Template" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_select_template.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/templates/stacks/update.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Update Stack Parameters" %}{% endblock %} 4 | 5 | {% block main %} 6 | {% include 'project/stacks/_update.html' %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/stacks/urls.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | from django.urls import re_path 14 | 15 | from heat_dashboard.content.stacks import views 16 | 17 | urlpatterns = [ 18 | re_path(r'^$', views.IndexView.as_view(), name='index'), 19 | re_path(r'^select_template$', 20 | views.SelectTemplateView.as_view(), 21 | name='select_template'), 22 | re_path(r'^launch$', views.CreateStackView.as_view(), name='launch'), 23 | re_path(r'^preview_template$', 24 | views.PreviewTemplateView.as_view(), name='preview_template'), 25 | re_path(r'^preview$', views.PreviewStackView.as_view(), name='preview'), 26 | re_path(r'^preview_details$', 27 | views.PreviewStackDetailsView.as_view(), name='preview_details'), 28 | re_path(r'^stack/(?P[^/]+)/$', 29 | views.DetailView.as_view(), name='detail'), 30 | re_path(r'^(?P[^/]+)/change_template$', 31 | views.ChangeTemplateView.as_view(), name='change_template'), 32 | re_path(r'^(?P[^/]+)/edit_stack$', 33 | views.EditStackView.as_view(), name='edit_stack'), 34 | re_path(r'^stack/(?P[^/]+)/(?P[^/]+)/$', 35 | views.ResourceView.as_view(), name='resource'), 36 | re_path(r'^get_d3_data/(?P[^/]+)/$', 37 | views.JSONView.as_view(), name='d3_data'), 38 | ] 39 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_generator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/content/template_generator/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/content/template_generator/panel.py: -------------------------------------------------------------------------------- 1 | # Copyright 2017 NTT Communications. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 4 | # not use this file except in compliance with the License. You may obtain 5 | # a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | # License for the specific language governing permissions and limitations 13 | # under the License. 14 | 15 | from django.utils.translation import gettext_lazy as _ 16 | 17 | import horizon 18 | 19 | 20 | class TemplateGenerator(horizon.Panel): 21 | name = _("Template Generator") 22 | slug = 'template_generator' 23 | permissions = ('openstack.services.orchestration',) 24 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_generator/urls.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | from django.urls import re_path 14 | 15 | from heat_dashboard.content.template_generator import views 16 | 17 | urlpatterns = [ 18 | re_path(r'^$', views.IndexView.as_view(), name='index'), 19 | re_path(r'^get_resource_options$', 20 | views.OptionView.as_view(), name="apis"), 21 | ] 22 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_generator/views.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | 14 | from django.http import HttpResponse # noqa 15 | from django.utils.translation import gettext_lazy as _ 16 | from django.views import generic 17 | 18 | from horizon.browsers.views import AngularIndexView 19 | 20 | from heat_dashboard.content.template_generator import api 21 | 22 | 23 | class IndexView(AngularIndexView): 24 | template_name = 'project/template_generator/index.html' 25 | page_title = _("Template Generator") 26 | 27 | 28 | class OptionView(generic.View): 29 | def get(self, request): 30 | return HttpResponse(api.get_resource_options(request), 31 | content_type="application/json") 32 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/content/template_versions/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.utils.translation import gettext_lazy as _ 15 | 16 | import horizon 17 | 18 | 19 | class TemplateVersions(horizon.Panel): 20 | name = _("Template Versions") 21 | slug = "template_versions" 22 | permissions = ('openstack.services.orchestration',) 23 | policy_rules = (("orchestration", "stacks:list_template_versions"),) 24 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/tables.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.template import defaultfilters as filters 15 | from django.utils.translation import gettext_lazy as _ 16 | 17 | from horizon import tables 18 | 19 | 20 | class TemplateVersionsTable(tables.DataTable): 21 | version = tables.Column( 22 | "version", 23 | verbose_name=_("Version"), 24 | link="horizon:project:template_versions:details",) 25 | type = tables.Column( 26 | "type", 27 | verbose_name=_("Type"), 28 | filters=(filters.upper,)) 29 | 30 | def get_object_id(self, template_versions): 31 | return template_versions.version 32 | 33 | class Meta(object): 34 | name = "template_versions" 35 | table_actions = (tables.FilterAction,) 36 | verbose_name = _("Template Versions") 37 | table_actions = (tables.FilterAction,) 38 | multi_select = False 39 | 40 | 41 | class TemplateFunctionsTable(tables.DataTable): 42 | functions = tables.Column('functions', verbose_name=_("Function")) 43 | description = tables.Column('description', verbose_name=_("Description")) 44 | 45 | def get_object_id(self, template_functions): 46 | return template_functions.functions 47 | 48 | class Meta(object): 49 | name = "template_functions" 50 | verbose_name = _("Template Functions") 51 | table_actions = (tables.FilterAction,) 52 | multi_select = False 53 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/tabs.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.utils.translation import gettext_lazy as _ 15 | 16 | from horizon import messages 17 | from horizon import tabs 18 | from openstack_dashboard import policy 19 | 20 | from heat_dashboard import api 21 | 22 | from heat_dashboard.content.template_versions import tables as project_tables 23 | 24 | 25 | class TemplateFunctionsTab(tabs.Tab): 26 | name = _("Template Functions") 27 | slug = "template_functions" 28 | template_name = "project/template_versions/_details.html" 29 | preload = False 30 | 31 | def allowed(self, request): 32 | return policy.check( 33 | (("orchestration", "stacks:list_template_functions"),), 34 | request) 35 | 36 | def get_context_data(self, request): 37 | template_version = self.tab_group.kwargs['template_version'] 38 | try: 39 | template_functions = api.heat.template_function_list( 40 | self.request, template_version) 41 | except Exception: 42 | template_functions = [] 43 | messages.error(request, _('Unable to get functions for template ' 44 | 'version "%s".') % template_version) 45 | return {"table": project_tables.TemplateFunctionsTable( 46 | request, data=template_functions), } 47 | 48 | 49 | class TemplateVersionDetailsTabs(tabs.TabGroup): 50 | slug = "template_version_details" 51 | tabs = (TemplateFunctionsTab,) 52 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/templates/stacks.template_versions/_details.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | {{ table.render }} 4 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/templates/stacks.template_versions/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Template Versions" %}{% endblock %} 4 | 5 | {% block main %} 6 | {{ table.render }} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/templates/template_versions/_details.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | {{ table.render }} 4 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/templates/template_versions/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Template Versions" %}{% endblock %} 4 | 5 | {% block main %} 6 | {{ table.render }} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /heat_dashboard/content/template_versions/urls.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.urls import re_path 15 | 16 | from heat_dashboard.content.template_versions import views 17 | 18 | 19 | urlpatterns = [ 20 | re_path(r'^$', views.TemplateVersionsView.as_view(), name='index'), 21 | re_path(r'^(?P[^/]+)/$', 22 | views.DetailView.as_view(), name='details'), 23 | ] 24 | -------------------------------------------------------------------------------- /heat_dashboard/enabled/_1610_project_orchestration_panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | from django.utils.translation import gettext_lazy as _ 14 | 15 | from heat_dashboard import exceptions 16 | 17 | # The slug of the panel group to be added to HORIZON_CONFIG. Required. 18 | PANEL_GROUP = 'orchestration' 19 | # The display name of the PANEL_GROUP. Required. 20 | PANEL_GROUP_NAME = _('Orchestration') 21 | # The slug of the dashboard the PANEL_GROUP associated with. Required. 22 | PANEL_GROUP_DASHBOARD = 'project' 23 | 24 | ADD_INSTALLED_APPS = ["heat_dashboard", ] 25 | 26 | ADD_EXCEPTIONS = { 27 | 'not_found': exceptions.NOT_FOUND, 28 | 'recoverable': exceptions.RECOVERABLE, 29 | 'unauthorized': exceptions.UNAUTHORIZED 30 | } 31 | -------------------------------------------------------------------------------- /heat_dashboard/enabled/_1620_project_stacks_panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | # The slug of the panel to be added to HORIZON_CONFIG. Required. 14 | PANEL = 'stacks' 15 | # The slug of the dashboard the PANEL associated with. Required. 16 | PANEL_DASHBOARD = 'project' 17 | # The slug of the panel group the PANEL is associated with. 18 | PANEL_GROUP = 'orchestration' 19 | 20 | # Python panel class of the PANEL to be added. 21 | ADD_PANEL = 'heat_dashboard.content.stacks.panel.Stacks' 22 | 23 | # Automatically discover static resources in installed apps 24 | AUTO_DISCOVER_STATIC_FILES = True 25 | -------------------------------------------------------------------------------- /heat_dashboard/enabled/_1630_project_resource_types_panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | # The slug of the panel to be added to HORIZON_CONFIG. Required. 14 | PANEL = 'resource_types' 15 | # The slug of the dashboard the PANEL associated with. Required. 16 | PANEL_DASHBOARD = 'project' 17 | # The slug of the panel group the PANEL is associated with. 18 | PANEL_GROUP = 'orchestration' 19 | 20 | # Python panel class of the PANEL to be added. 21 | ADD_PANEL = 'heat_dashboard.content.resource_types.panel.ResourceTypes' 22 | 23 | # Automatically discover static resources in installed apps 24 | AUTO_DISCOVER_STATIC_FILES = True 25 | 26 | # ADD_INSTALLED_APPS = ['heat_dashboard.content.resource_types', ] 27 | DISABLED = False 28 | -------------------------------------------------------------------------------- /heat_dashboard/enabled/_1640_project_template_versions_panel.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | # The slug of the panel to be added to HORIZON_CONFIG. Required. 14 | PANEL = 'template_versions' 15 | # The slug of the dashboard the PANEL associated with. Required. 16 | PANEL_DASHBOARD = 'project' 17 | # The slug of the panel group the PANEL is associated with. 18 | PANEL_GROUP = 'orchestration' 19 | 20 | # Python panel class of the PANEL to be added. 21 | ADD_PANEL = 'heat_dashboard.content.template_versions.panel.TemplateVersions' 22 | 23 | # Automatically discover static resources in installed apps 24 | AUTO_DISCOVER_STATIC_FILES = True 25 | -------------------------------------------------------------------------------- /heat_dashboard/enabled/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/enabled/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/exceptions.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | from heatclient import exc as heatclient 14 | 15 | 16 | UNAUTHORIZED = ( 17 | heatclient.Unauthorized, 18 | ) 19 | 20 | 21 | NOT_FOUND = ( 22 | heatclient.NotFound, 23 | ) 24 | 25 | 26 | RECOVERABLE = ( 27 | heatclient.HTTPException, 28 | ) 29 | -------------------------------------------------------------------------------- /heat_dashboard/local_settings.d/_1699_orchestration_settings.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | # This file is to be included for configuring application which relates 14 | # to orchestration(Heat) functions. 15 | 16 | from django.conf import settings 17 | 18 | 19 | OPENSTACK_HEAT_STACK = { 20 | 'enable_user_pass': True, 21 | } 22 | 23 | settings.POLICY_FILES.update({ 24 | 'orchestration': 'heat_policy.yaml', 25 | }) 26 | 27 | settings.DEFAULT_POLICY_FILES.update({ 28 | 'orchestration': 'default_policies/heat.yaml', 29 | }) 30 | 31 | # Sample 32 | # settings.LOGGING['loggers'].update({ 33 | # 'heatclient': { 34 | # 'handlers': ['console'], 35 | # 'level': 'DEBUG', 36 | # 'propagate': False, 37 | # } 38 | # }) 39 | 40 | # Template Generator retrieve options API TIMEOUT 41 | HEAT_TEMPLATE_GENERATOR_API_TIMEOUT = 60 42 | 43 | # Template Generator retrieve options API PARALLEL LEVEL 44 | HEAT_TEMPLATE_GENERATOR_API_PARALLEL = 2 45 | -------------------------------------------------------------------------------- /heat_dashboard/local_settings.d/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/local_settings.d/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/alarm-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/alarm-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/apple-touch-icon.png -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/config-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/config-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/db-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/db-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/drag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/drag.png -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/favicon.ico -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/firewall-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/firewall-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/flavor-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/flavor-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/floatingip-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/floatingip-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/image-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/image-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/keypair-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/keypair-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/lb-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/lb-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/network-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/network-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/policy-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/policy-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/port-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/port-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/router-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/router-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 17 | 19 | 21 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/securitygroup-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/securitygroup-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/securitygroup-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 9 | 27 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/securitygroup-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 9 | 27 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/securitygroup-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 9 | 27 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/server-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/server-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/spinner.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/stack-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/stack-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/unknown-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/unknown-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/volume-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/volume-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/vpn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/vpn.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/img/wait-gray.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/static/dashboard/project/heat_dashboard/img/wait-gray.gif -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/stacks/actions/actions-checked-selected.template.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | $text$ 6 | 7 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/angular-notify.scss: -------------------------------------------------------------------------------- 1 | .cg-notify-message { 2 | position:fixed; 3 | top:0px; 4 | z-index: 9999; 5 | max-width:400px; 6 | text-align: center; 7 | 8 | background-color: #d9edf7; 9 | color: #31708f; 10 | padding: 15px; 11 | border: 1px solid #bce8f1; 12 | border-radius: 4px; 13 | 14 | -webkit-transition: top 0.5s ease-out,opacity 0.2s ease-out; 15 | -moz-transition: top 0.5s ease-out,opacity 0.2s ease-out; 16 | -o-transition: top 0.5s ease-out,opacity 0.2s ease-out; 17 | transition: top 0.5s ease-out,opacity 0.2s ease-out; 18 | 19 | visibility:hidden; 20 | 21 | -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); 22 | box-shadow: 0 6px 12px rgba(0,0,0,.175); 23 | } 24 | 25 | .cg-notify-message-center { 26 | left:50%; 27 | } 28 | 29 | .cg-notify-message-left { 30 | left:15px; 31 | } 32 | 33 | .cg-notify-message-right { 34 | right:15px; 35 | } 36 | 37 | .cg-notify-message a { 38 | font-weight:bold; 39 | color:inherit; 40 | } 41 | 42 | .cg-notify-message a:hover { 43 | color:inherit; 44 | } 45 | 46 | .cg-notify-close { 47 | -webkit-appearance: none; 48 | padding: 0; 49 | cursor: pointer; 50 | background: 0 0; 51 | border: 0; 52 | font-size: 21px; 53 | font-weight: 700; 54 | line-height: 1; 55 | color: #000; 56 | text-shadow: 0 1px 0 #fff; 57 | filter: alpha(opacity=20); 58 | opacity: .2; 59 | 60 | position: absolute; 61 | top: 0px; 62 | right: 3px; 63 | line-height: 15px; 64 | } 65 | 66 | .cg-notify-close:hover, .cg-notify-close:focus { 67 | color: #000; 68 | text-decoration: none; 69 | cursor: pointer; 70 | filter: alpha(opacity=50); 71 | opacity: .5; 72 | } 73 | 74 | .cg-notify-sr-only { 75 | position: absolute; 76 | width: 1px; 77 | height: 1px; 78 | padding: 0; 79 | margin: -1px; 80 | overflow: hidden; 81 | clip: rect(0,0,0,0); 82 | border: 0; 83 | } -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/hotgen-main.scss: -------------------------------------------------------------------------------- 1 | // My Themes 2 | @import "/dashboard/project/heat_dashboard/template_generator/css/angular-material.scss"; 3 | @import "/dashboard/project/heat_dashboard/template_generator/css/angular-notify.scss"; 4 | @import "/dashboard/project/heat_dashboard/template_generator/css/hotgen.scss"; 5 | @import "/dashboard/project/heat_dashboard/template_generator/css/vis.scss"; -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/img/icons/file-text-o.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/img/icons/floppy-o.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/img/icons/ic_close_24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/img/icons/ic_help_outline_24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/css/img/icons/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/agent.module.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular.module('hotgen-agent', ['hotgen-utils', ]) 5 | .factory('hotgenAgent', ['$http', '$location', 'hotgenNotify', 6 | function($http, $location, hotgenNotify) { 7 | var get_resource_options = function(){ 8 | var static_url = $location.absUrl(); 9 | if (static_url.substr(-1) != '/'){ 10 | static_url += '/'; 11 | } 12 | return $http({ 13 | method: 'GET', 14 | url: static_url+'get_resource_options' 15 | }).then(function successCallback(response) { 16 | // this callback will be called asynchronously 17 | // when the response is available 18 | if (response.data.errors){ 19 | var msg = ''; 20 | angular.forEach(response.data.errors, function(value, key){ 21 | msg += key + ': '+ value + '. ' 22 | }) 23 | 24 | hotgenNotify.show_warning('Unable to retrieve resources '+msg+'.'); 25 | } 26 | else{ 27 | hotgenNotify.show_success('Retrieve openstack resources successfully.'); 28 | } 29 | return response.data; 30 | }, function errorCallback(response) { 31 | // called asynchronously if an error occurs 32 | // or server returns response with an error status. 33 | hotgenNotify.show_error('Cannot get openstack resources.'); 34 | return null; 35 | }); 36 | } 37 | return { 38 | get_resource_options: get_resource_options, 39 | }; 40 | }]) 41 | 42 | })(); 43 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/compile.directive.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | angular.module('hotgen-utils') 4 | .directive('compile', [ '$compile', function($compile){ 5 | return { 6 | link: function(scope, element, attrs){ 7 | var content = $compile(attrs.compile)(scope); 8 | element.append(content); 9 | } 10 | } 11 | }]); 12 | 13 | })(); 14 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/compile.directive.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | describe('hotgen-utils compile directive', function(){ 5 | beforeEach(module('hotgen-utils')); 6 | 7 | var $compile, $rootScope, $scope, $isolateScope, element; 8 | 9 | beforeEach(inject(function($rootScope, $compile) { 10 | $scope = $rootScope.$new(); 11 | 12 | // element will enable you to test your directive's element on the DOM 13 | element = $compile(angular.element('
'))($scope); 14 | 15 | // Digest needs to be called to set any values on the directive's scope 16 | $scope.$digest(); 17 | 18 | // If the directive uses isolate scope, we need to get a reference to it 19 | // explicitly 20 | })); 21 | 22 | 23 | it('Replaces the element with the appropriate content', function() { 24 | expect(element.html()).toContain("Compile Me"); 25 | }); 26 | 27 | }); 28 | 29 | })(); 30 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/dependson.directive.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | 4 | /* Directive 5 | * 6 | */ 7 | 8 | function dependsonController($scope, hotgenStates, basePath){ 9 | this.$onInit = function(){ 10 | $scope.dependson = this.dependson; 11 | } 12 | $scope.basePath = basePath; 13 | $scope.edges = hotgenStates.get_edges(); 14 | $scope.nodes = hotgenStates.get_nodes(); 15 | $scope.selected = hotgenStates.get_selected(); 16 | $scope.toggle = function (item, list) { 17 | if (typeof item == 'undefined' || !(list instanceof Array)){ 18 | return; 19 | } 20 | var idx = list.indexOf(item); 21 | if (idx > -1) { 22 | list.splice(idx, 1); 23 | } 24 | else { 25 | list.push(item); 26 | } 27 | }; 28 | 29 | $scope.exists = function (item, list) { 30 | if (typeof item != "undefined" && list instanceof Array){ 31 | return list.indexOf(item) > -1; 32 | } 33 | return false; 34 | }; 35 | 36 | } 37 | 38 | function dependsonPath (basePath){ 39 | return basePath + 'templates/depends_on.html'; 40 | } 41 | dependsonPath.$inject = ['horizon.dashboard.project.heat_dashboard.template_generator.basePath']; 42 | dependsonController.$inject = [ 43 | '$scope', 'hotgenStates', 44 | 'horizon.dashboard.project.heat_dashboard.template_generator.basePath']; 45 | 46 | angular.module('horizon.dashboard.project.heat_dashboard.template_generator') 47 | .component('dependsOn', { 48 | templateUrl: dependsonPath, 49 | controller: dependsonController, 50 | bindings:{ 51 | 'dependson': '=', 52 | } 53 | }); 54 | 55 | })(); 56 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/dependson.directive.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | describe('horizon.dashboard.project.heat_dashboard.template_generator dependson directive', function(){ 5 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 6 | 7 | beforeEach(module('appTemplates')); 8 | 9 | var $compile, $rootScope, $scope, $isolateScope, element; 10 | 11 | beforeEach(inject(function($rootScope, $compile) { 12 | $scope = $rootScope.$new(); 13 | $scope.dependson = ['node-id-1111', 'node-id-2222', 'node-id-3333']; 14 | 15 | // element will enable you to test your directive's element on the DOM 16 | element = $compile(angular.element(''))($scope); 17 | 18 | // Digest needs to be called to set any values on the directive's scope 19 | $scope.$digest(); 20 | 21 | // If the directive uses isolate scope, we need to get a reference to it 22 | // explicitly 23 | $isolateScope = element.isolateScope(); 24 | })); 25 | 26 | 27 | it('Replaces the element with the appropriate content', function() { 28 | expect(element.find('label').html()).toContain("Depends on"); 29 | }); 30 | 31 | it('toggle function modifies array', function() { 32 | var array = [0, 1, 2, 3, 4]; 33 | $isolateScope.toggle(5, array); 34 | 35 | expect(array.length).toEqual(6); 36 | 37 | $isolateScope.toggle(0, array); 38 | $isolateScope.toggle(5, array); 39 | 40 | expect(array.length).toEqual(4); 41 | }); 42 | 43 | it('check array item existence ', function() { 44 | var array = [0, 1, 2, 3, 4]; 45 | 46 | expect($isolateScope.exists(5, array)).toEqual(false); 47 | expect($isolateScope.exists(1, array)).toEqual(true); 48 | }); 49 | }); 50 | 51 | })(); 52 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/draggable.directive.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 3 | 'use strict'; 4 | 5 | angular.module('horizon.dashboard.project.heat_dashboard.template_generator').directive('draggable', [function(){ 6 | return function ($scope, element){ 7 | var el = element[0]; 8 | 9 | el.draggable = true; 10 | 11 | $scope.dragstartHandler = function(e){ 12 | el.style.opacity = '0.4'; 13 | e.dataTransfer.setData('text', e.target.id); 14 | } 15 | $scope.dragendHandler = function(e){ 16 | el.style.opacity = '1.0'; 17 | } 18 | 19 | 20 | el.addEventListener('dragstart', $scope.dragstartHandler, false); 21 | 22 | el.addEventListener('dragend', $scope.dragendHandler, false); 23 | 24 | } 25 | }]); 26 | 27 | })(); -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/draggable.directive.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | describe('horizon.dashboard.project.heat_dashboard.template_generator draggable directive', function(){ 5 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 6 | 7 | var $compile, $rootScope, $scope, $isolateScope, element; 8 | 9 | beforeEach(inject(function($rootScope, $compile) { 10 | $scope = $rootScope.$new(); 11 | 12 | // element will enable you to test your directive's element on the DOM 13 | element = $compile(angular.element('
drag me
'))($scope); 14 | 15 | // Digest needs to be called to set any values on the directive's scope 16 | $scope.$digest(); 17 | 18 | // If the directive uses isolate scope, we need to get a reference to it 19 | // explicitly 20 | $isolateScope = element.isolateScope(); 21 | })); 22 | 23 | 24 | it('Replaces the element with the appropriate content', function() { 25 | expect(element[0].draggable).toEqual(true); 26 | }); 27 | 28 | it('should change style when drag start', function() { 29 | var mockEvent = { 30 | 'type': 'dragstart', 31 | 'dataTransfer': { 32 | 'setData': function(key, value){}, 33 | }, 34 | 'target': {'id': 'icon-1'} 35 | }; 36 | $scope.dragstartHandler(mockEvent, element); 37 | 38 | expect(element[0].style.opacity).toEqual('0.4') 39 | }); 40 | 41 | it('should change style when drag end', function() { 42 | var mockEvent = { 43 | 'type': 'dragend', 44 | }; 45 | $scope.dragendHandler(mockEvent, element); 46 | 47 | expect(element[0].style.opacity).toEqual('1') 48 | }); 49 | 50 | }); 51 | 52 | })(); 53 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/icons.controller.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular.module('horizon.dashboard.project.heat_dashboard.template_generator') 5 | .controller('horizon.dashboard.project.heat_dashboard.template_generator.IconController', ['$scope', 'hotgenGlobals', 6 | 'horizon.dashboard.project.heat_dashboard.template_generator.basePath', 7 | function($scope, hotgenGlobals, basePath){ 8 | $scope.resource_types = hotgenGlobals.get_resource_icons(); 9 | $scope.resource_admin = hotgenGlobals.get_node_admin(); 10 | $scope.admin = hotgenGlobals.get_resource_options().auth.admin; 11 | $scope.basePath = basePath; 12 | 13 | $scope.project_types = {}; 14 | for (var idx in $scope.resource_types){ 15 | var pidx = idx.split('__'); 16 | if (!pidx || pidx.length != 3){ 17 | continue 18 | } 19 | var level = pidx[0]+'::'+pidx[1] 20 | if (! (level in $scope.project_types)){ 21 | $scope.project_types[level] = {} 22 | } 23 | $scope.project_types[level][idx] = $scope.resource_types[idx]; 24 | } 25 | $scope.currentNavItem = Object.keys($scope.project_types)[0]; 26 | $scope.showIcon = function(){ 27 | // console.log($scope.currentNavItem) 28 | }; 29 | 30 | }]); 31 | })(); 32 | 33 | 34 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/icons.controller.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | describe('horizon.dashboard.project.heat_dashboard.template_generator.IconController', function(){ 5 | 6 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 7 | 8 | var $controller, controller, $scope, hotgenGlobals; 9 | 10 | beforeEach(inject(function($injector){ 11 | hotgenGlobals = $injector.get('hotgenGlobals'); 12 | hotgenGlobals.update_resource_icons('OS__Project__Resource', ''); 13 | hotgenGlobals.update_resource_icons('OS__Key', ''); 14 | })); 15 | 16 | beforeEach(inject(function(_$controller_, $rootScope) { 17 | $controller = _$controller_; 18 | $scope = $rootScope.$new(); 19 | controller = $controller('horizon.dashboard.project.heat_dashboard.template_generator.IconController', { $scope: $scope,}); 20 | })); 21 | 22 | it('should exist', function(){ 23 | expect(controller).toBeDefined(); 24 | }); 25 | 26 | it('check scope parameters', inject([ '$window', function($window){ 27 | var icons_number = Object.keys(hotgenGlobals.get_resource_icons()).length; 28 | 29 | expect(Object.keys($scope.resource_types).length).toEqual(icons_number); 30 | 31 | var admin_number = Object.keys(hotgenGlobals.get_node_admin()).length; 32 | 33 | expect(Object.keys($scope.resource_admin).length).toEqual(admin_number); 34 | expect($scope.admin).toEqual(false); 35 | expect($scope.basePath).toBe($window.STATIC_URL + 'dashboard/project/heat_dashboard/template_generator/'); 36 | 37 | }])); 38 | 39 | }); 40 | 41 | })(); 42 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/loading.controller.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 3 | 'use strict'; 4 | 5 | angular 6 | .module('horizon.dashboard.project.heat_dashboard.template_generator') 7 | .controller('horizon.dashboard.project.heat_dashboard.template_generator.LoadingController', [ 8 | '$scope', 'hotgenNotify', 9 | 'horizon.dashboard.project.heat_dashboard.template_generator.basePath', 10 | function($scope, hotgenNotify, basePath){ 11 | $scope.loading = true; 12 | $scope.basePath = basePath; 13 | $scope.$on('handle_resources_loaded', function(event, args){ 14 | hotgenNotify.show_info('Close loading.'); 15 | $scope.loading = false; 16 | }); 17 | 18 | }]) 19 | 20 | })(); 21 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/loading.controller.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | describe('LoadingController', function(){ 4 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 5 | 6 | var $controller, controller, $scope, $rootScope; 7 | 8 | beforeEach(inject(function(_$controller_, $rootScope) { 9 | $controller = _$controller_; 10 | $scope = $rootScope.$new(); 11 | controller = $controller('horizon.dashboard.project.heat_dashboard.template_generator.LoadingController', { $scope: $scope,}); 12 | })); 13 | 14 | beforeEach(inject(function(_$rootScope_) { 15 | $rootScope = _$rootScope_; 16 | })); 17 | 18 | it('should exist', function(){ 19 | expect(controller).toBeDefined(); 20 | }); 21 | 22 | it('loading is false by default', function(){ 23 | expect($scope.loading).toEqual(true); 24 | }); 25 | 26 | it('loading is true after message received', function(){ 27 | $rootScope.$broadcast('handle_resources_loaded'); 28 | 29 | expect($scope.loading).toEqual(false); 30 | 31 | }); 32 | 33 | }); 34 | 35 | 36 | })(); 37 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/template-generator.module.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('horizon.dashboard.project.heat_dashboard.template_generator', 6 | ['ngMaterial', 'ngMessages', 'ngSanitize', 7 | 'hotgen-utils', 'hotgen-agent', 'ui.bootstrap', 8 | ]) 9 | .config(['$mdThemingProvider', function($mdThemingProvider) { 10 | $mdThemingProvider.theme('default') 11 | .primaryPalette('indigo') 12 | .accentPalette('blue') 13 | .warnPalette('red') 14 | ; 15 | }]) 16 | .config(['$provide', '$windowProvider', function($provide, $windowProvider){ 17 | var project_window = $windowProvider.$get(); 18 | var staticPath = project_window.STATIC_URL + 'dashboard/project/heat_dashboard/template_generator/'; 19 | var projectPath = project_window.WEBROOT+'project/'; 20 | $provide.constant('horizon.dashboard.project.heat_dashboard.template_generator.basePath', staticPath); 21 | $provide.constant('horizon.dashboard.project.heat_dashboard.template_generator.projectPath', projectPath); 22 | 23 | }]) 24 | .constant('horizon.dashboard.project.heat_dashboard.template_generator.validationRules', { 25 | 'name': /^[A-Za-z0-9_.-]+$/, 26 | 'path': /^\/[a-z0-9/-]+$/, 27 | 'integer': /^\d*$/, 28 | 'keypair': /^([A-Za-z0-9_.-]{1,255})=([A-Za-z0-9_.-]{1,255})$/, 29 | 'ip_address': /^([0-9.]{1,15})|([A-Fa-f0-9:]{1,39})$/, 30 | 'domain': /^[A-Za-z0-9_.-]+$/, 31 | 'uuid4': /^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/, 32 | 'uuid_nohyphen': /^[a-f0-9]{32}$/, 33 | 'mac_address': /^([A-Fa-f0-9]{2}[:-]){5}([A-Fa-f0-9]{2})$/, 34 | 'cidr': /^(([0-9.]{1,15})(\/([0-9]|[1-2][0-9]|3[0-2]))?)|(([A-Fa-f0-9:]{1,39})(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?)$/, 35 | 'zone': /^[a-zA-Z0-9_.-]{1,127}\.$/, 36 | }) 37 | ; 38 | 39 | 40 | })(); 41 | 42 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/components/template-generator.module.spec.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | describe('horizon.dashboard.project.heat_dashboard.template_generator module', function () { 5 | it('should be defined', function () { 6 | expect(angular.module('horizon.dashboard.project.heat_dashboard.template_generator')).toBeDefined(); 7 | }); 8 | }); 9 | 10 | describe('horizon.dashboard.project.heat_dashboard.template_generator.basePath', function () { 11 | 12 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 13 | 14 | it('should be defined and set correctly', inject([ 15 | 'horizon.dashboard.project.heat_dashboard.template_generator.basePath', '$window', 16 | function (basePath, $window) { 17 | expect(basePath).toBeDefined(); 18 | expect(basePath).toBe($window.STATIC_URL + 'dashboard/project/heat_dashboard/template_generator/'); 19 | }]) 20 | ); 21 | }); 22 | 23 | })(); 24 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__recordset/os__designate__recordset-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSRECORD -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__recordset/os__designate__recordset-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSRECORD -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__recordset/os__designate__recordset-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSRECORD -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__recordset/os__designate__recordset-red.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSRECORD -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__recordset/os__designate__recordset.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | describe('component os-designate-recordset', function(){ 5 | 6 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 7 | 8 | beforeEach(module('appTemplates')); 9 | 10 | var $scope, $isolateScope, $compile; 11 | var element; 12 | 13 | beforeEach(inject(function($injector) { 14 | $scope = $injector.get('$rootScope').$new(); 15 | $compile = $injector.get('$compile'); 16 | 17 | $scope.resource = {}; 18 | $scope.dependson = []; 19 | $scope.connectedoptions = []; 20 | $scope.resourceForm = {}; 21 | 22 | // element will enable you to test your directive's element on the DOM 23 | element = $compile(angular.element(''))($scope); 26 | 27 | // Digest needs to be called to set any values on the directive's scope 28 | $scope.$digest(); 29 | 30 | $isolateScope = element.isolateScope(); 31 | })); 32 | 33 | it('find tab title Properties', function() { 34 | expect(element.find('span').html()).toContain("Properties"); 35 | }); 36 | 37 | it('find tab title Properties with resource properties set', function() { 38 | $scope.resource = { masters: [], attributes: []}; 39 | element = $compile(angular.element(''+ 41 | ''))($scope); 42 | 43 | $scope.$digest(); 44 | 45 | expect(element.find('span').html()).toContain("Properties"); 46 | }); 47 | }); 48 | 49 | })(); 50 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__recordset/os__designate__recordset.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSRECORD -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__zone/os__designate__zone-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSZONE -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__zone/os__designate__zone-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSZONE -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__zone/os__designate__zone-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSZONE -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__zone/os__designate__zone-red.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSZONE -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__designate__zone/os__designate__zone.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | Layer 1DNSZONE -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__floatingip/os__neutron__floatingip-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__floatingip/os__neutron__floatingip-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__floatingip/os__neutron__floatingip.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__net/os__neutron__net-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Layer 1 -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__net/os__neutron__net-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Layer 1 -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__net/os__neutron__net-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Layer 1 -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__net/os__neutron__net-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Layer 1 -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__net/os__neutron__net.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Layer 1 -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__router/os__neutron__router-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__router/os__neutron__router-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__router/os__neutron__router-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__router/os__neutron__router-red.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__router/os__neutron__router.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__routerinterface/os__neutron__routerinterface.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

{$ $ctrl.message $}

5 | 6 | 7 | 8 | 9 | {$ router.name $} 10 | 11 | 12 |
13 |
You must supply a router.
14 |
15 |
16 | 17 | 18 | 19 | 20 | {$ port.name $} 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {$ subnet.name $} 29 | 30 | 31 | 32 |
33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__securitygroup/os__neutron__securitygroup-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__securitygroup/os__neutron__securitygroup-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__securitygroup/os__neutron__securitygroup-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__securitygroup/os__neutron__securitygroup-red.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__neutron__securitygroup/os__neutron__securitygroup.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__nova__keypair/os__nova__keypair.spec.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | describe('component os-nova-keypair', function(){ 5 | 6 | beforeEach(module('horizon.dashboard.project.heat_dashboard.template_generator')); 7 | 8 | beforeEach(module('appTemplates')); 9 | 10 | var $scope, $isolateScope, $compile; 11 | var hotgenGlobals; 12 | var element; 13 | 14 | beforeEach(inject(function($injector) { 15 | $scope = $injector.get('$rootScope').$new(); 16 | $compile = $injector.get('$compile'); 17 | 18 | $scope.resource = {}; 19 | $scope.dependson = []; 20 | $scope.resourceForm = {}; 21 | 22 | // element will enable you to test your directive's element on the DOM 23 | element = $compile(angular.element(''+ 25 | ''))($scope); 26 | 27 | // Digest needs to be called to set any values on the directive's scope 28 | $scope.$digest(); 29 | 30 | $isolateScope = element.isolateScope(); 31 | })); 32 | 33 | it('find tab title Properties', function() { 34 | expect(element.find('span').html()).toContain("Properties"); 35 | }); 36 | 37 | }); 38 | 39 | })(); 40 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__nova__server/os__nova__server-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__nova__server/os__nova__server-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__nova__server/os__nova__server-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__nova__server/os__nova__server-red.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__nova__server/os__nova__server.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__swift__container/os__swift__container-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__swift__container/os__swift__container-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__swift__container/os__swift__container-green.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__swift__container/os__swift__container-red.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/resources/os__swift__container/os__swift__container.svg: -------------------------------------------------------------------------------- 1 | 2 | Layer 1 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/templates/depends_on.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | Check following resources to specify the depends_on relations. 6 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | {{ node.label }} 16 | 17 | 18 |
-------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/templates/modal_draft.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |

{$ 'Saved Drafts' | translate $}

5 | 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 | Last saved draft is {$ latest_draft.time $}. 15 | You haven't saved any draft yet! 16 | 17 | {$ draft.time $} 18 | 19 |
20 |
21 |
22 | 23 | 24 | 25 | {$ 'OK' | translate $} 26 | 27 | 28 |
-------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/templates/modal_resource.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |

Resource {$ resource_type $}

6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | {$ 'Delete Resource' | translate $} 20 | 21 | 22 | {$ 'Cancel' | translate $} 23 | 24 | 25 | {$ 'Save' | translate $} 26 | 27 | 28 |
29 |
30 | -------------------------------------------------------------------------------- /heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/templates/modal_template.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |

{$ 'Heat Orchestration Template' | translate $}

6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 | 15 |
16 | {$ warning | translate $} 17 | 18 | 19 | 20 | 22 | 23 |
24 |
25 |
26 | 27 | 28 | 29 | 30 | {$ 'Cancel' | translate $} 31 | 32 | 33 | {$ 'Download' | translate $} 34 | 35 | 36 | {$ 'Create Stack' | translate $} 37 | 38 | 39 |
40 |
-------------------------------------------------------------------------------- /heat_dashboard/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/integration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/integration/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/integration/horizon.conf: -------------------------------------------------------------------------------- 1 | [plugin] 2 | is_plugin=True 3 | plugin_page_path=heat_dashboard.test.integration.pages 4 | plugin_page_structure='{"Project": {"Orchestration": {"_": ["Stacks", "Resource Types", "Template Versions", "Template Generator"]}}}' 5 | 6 | -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/integration/pages/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/project/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/integration/pages/project/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/project/orchestration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/integration/pages/project/orchestration/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/project/orchestration/resourcetypespage.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests.pages import basepage 16 | 17 | 18 | class ResourcetypesPage(basepage.BaseNavigationPage): 19 | def __init__(self, driver, conf): 20 | super(ResourcetypesPage, self).__init__(driver, conf) 21 | self._page_title = "Resource Types" 22 | -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/project/orchestration/stackspage.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests.pages import basepage 16 | 17 | 18 | class StacksPage(basepage.BaseNavigationPage): 19 | def __init__(self, driver, conf): 20 | super(StacksPage, self).__init__(driver, conf) 21 | self._page_title = "Stacks" 22 | -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/project/orchestration/templategeneratorpage.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests.pages import basepage 16 | 17 | 18 | class TemplategeneratorPage(basepage.BaseNavigationPage): 19 | def __init__(self, driver, conf): 20 | super(TemplategeneratorPage, self).__init__(driver, conf) 21 | self._page_title = "Template Generator" 22 | -------------------------------------------------------------------------------- /heat_dashboard/test/integration/pages/project/orchestration/templateversionspage.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests.pages import basepage 16 | 17 | 18 | class TemplateversionsPage(basepage.BaseNavigationPage): 19 | def __init__(self, driver, conf): 20 | super(TemplateversionsPage, self).__init__(driver, conf) 21 | self._page_title = "Template Versions" 22 | -------------------------------------------------------------------------------- /heat_dashboard/test/integration/test_basic.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests import helpers 16 | 17 | 18 | class TestHeatDashboardInstalled(helpers.TestCase): 19 | def test_alarms_page_opened(self): 20 | stacks_page = self.home_pg.go_to_project_orchestration_stackspage() 21 | self.assertEqual(stacks_page.page_title, 22 | 'Stacks - OpenStack Dashboard') 23 | 24 | def test_resource_types_page_opened(self): 25 | resource_types_page = ( 26 | self.home_pg.go_to_project_orchestration_resourcetypespage()) 27 | self.assertEqual(resource_types_page.page_title, 28 | 'Resource Types - OpenStack Dashboard') 29 | 30 | def test_template_versions_page_opened(self): 31 | template_versions_page = ( 32 | self.home_pg.go_to_project_orchestration_templateversionspage()) 33 | self.assertEqual(template_versions_page.page_title, 34 | 'Template Versions - OpenStack Dashboard') 35 | 36 | def test_template_generator_page_opened(self): 37 | template_generator_page = ( 38 | self.home_pg.go_to_project_orchestration_templategeneratorpage()) 39 | # TODO(e0ne): fix page title once Heat dashaboard will be updated 40 | self.assertEqual(template_generator_page.page_title, 41 | 'Horizon - OpenStack Dashboard') 42 | -------------------------------------------------------------------------------- /heat_dashboard/test/settings.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | # Default to Horizons test settings to avoid any missing keys 15 | 16 | import openstack_dashboard.enabled # noqa: F811 17 | from openstack_dashboard.test.settings import * # noqa: F403,H303 18 | from openstack_dashboard.utils import settings 19 | 20 | import heat_dashboard.enabled 21 | 22 | # pop these keys to avoid log warnings about deprecation 23 | # update_dashboards will populate them anyway 24 | HORIZON_CONFIG.pop('dashboards', None) 25 | HORIZON_CONFIG.pop('default_dashboard', None) 26 | 27 | # Update the dashboards with heat_dashboard enabled files 28 | # and current INSTALLED_APPS 29 | settings.update_dashboards( 30 | [ 31 | openstack_dashboard.enabled, 32 | heat_dashboard.enabled, 33 | ], 34 | HORIZON_CONFIG, 35 | INSTALLED_APPS 36 | ) 37 | 38 | # Remove duplicated apps 39 | INSTALLED_APPS = list(set(INSTALLED_APPS)) 40 | -------------------------------------------------------------------------------- /heat_dashboard/test/test_data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/test_data/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/test_data/exceptions.py: -------------------------------------------------------------------------------- 1 | # Copyright 2012 Nebula, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 4 | # not use this file except in compliance with the License. You may obtain 5 | # a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | # License for the specific language governing permissions and limitations 13 | # under the License. 14 | 15 | import heatclient.exc as heat_exceptions 16 | 17 | from heat_dashboard.test.test_data import utils 18 | 19 | 20 | def create_stubbed_exception(cls, status_code=500): 21 | msg = "Expected failure." 22 | 23 | def fake_init_exception(self, code=None, message=None, **kwargs): 24 | if code is not None: 25 | if hasattr(self, 'http_status'): 26 | self.http_status = code 27 | else: 28 | self.code = code 29 | self.message = message or self.__class__.message 30 | 31 | try: 32 | # Neutron sometimes updates the message with additional 33 | # information, like a reason. 34 | self.message = self.message % kwargs 35 | except Exception: 36 | pass # We still have the main error message. 37 | 38 | def fake_str(self): 39 | return str(self.message) 40 | 41 | cls.__init__ = fake_init_exception 42 | cls.__str__ = fake_str 43 | cls.silence_logging = True 44 | return cls(status_code, msg) 45 | 46 | 47 | def data(TEST): 48 | TEST.exceptions = utils.TestDataContainer() 49 | 50 | heat_exception = heat_exceptions.HTTPException 51 | TEST.exceptions.heat = create_stubbed_exception(heat_exception) 52 | -------------------------------------------------------------------------------- /heat_dashboard/test/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/tests/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/tests/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/tests/api/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/tests/content/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/heat_dashboard/test/tests/content/__init__.py -------------------------------------------------------------------------------- /heat_dashboard/test/tests/content/test_resource_types.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); 2 | # you may not use this file except in compliance with the License. 3 | # You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 10 | # implied. 11 | # See the License for the specific language governing permissions and 12 | # limitations under the License. 13 | 14 | from django.urls import reverse 15 | 16 | from heat_dashboard import api 17 | from heat_dashboard.test import helpers as test 18 | from heat_dashboard.test.helpers import IsHttpRequest 19 | 20 | 21 | class ResourceTypesTests(test.TestCase): 22 | 23 | @test.create_mocks({api.heat: ('resource_types_list',)}) 24 | def test_index(self): 25 | self.mock_resource_types_list.return_value = \ 26 | self.resource_types.list() 27 | 28 | res = self.client.get( 29 | reverse('horizon:project:resource_types:index')) 30 | self.assertTemplateUsed( 31 | res, 'horizon/common/_data_table_view.html') 32 | self.assertContains(res, 'AWS::CloudFormation::Stack') 33 | self.mock_resource_types_list.assert_called_once_with( 34 | IsHttpRequest(), filters={}) 35 | 36 | @test.create_mocks({api.heat: ('resource_type_get',)}) 37 | def test_detail_view(self): 38 | rt = self.api_resource_types.first() 39 | 40 | self.mock_resource_type_get.return_value = rt 41 | 42 | url = reverse('horizon:project:resource_types:details', 43 | args=[rt['resource_type']]) 44 | res = self.client.get(url) 45 | 46 | self.assertTemplateUsed(res, 'horizon/common/_detail.html') 47 | self.assertNoMessages() 48 | self.mock_resource_type_get.assert_called_once_with( 49 | IsHttpRequest(), rt['resource_type']) 50 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 4 | # not use this file except in compliance with the License. You may obtain 5 | # a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | # License for the specific language governing permissions and limitations 13 | # under the License. 14 | 15 | import os 16 | import sys 17 | 18 | from django.core.management import execute_from_command_line 19 | 20 | if __name__ == "__main__": 21 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", 22 | "heat_dashboard.test.settings") 23 | execute_from_command_line(sys.argv) 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "heat-dashboard", 3 | "version": "0.0.0", 4 | "description": "OpenStack Heat Dashboard - Angular", 5 | "main": "karma.conf.js", 6 | "directories": { 7 | "doc": "doc" 8 | }, 9 | "devDependencies": { 10 | "@appscode/json2yaml": "0.1.0", 11 | "@cgross/angular-notify": "2.5.1", 12 | "angular": "1.5.8", 13 | "angular-animate": "1.5.8", 14 | "angular-aria": "1.5.8", 15 | "angular-material": "1.1.5", 16 | "angular-messages": "1.5.8", 17 | "angular-mocks": "1.5.8", 18 | "angular-notify": "1.0.0", 19 | "angular-sanitize": "1.5.8", 20 | "angular-ui-bootstrap": "2.5.0", 21 | "angular-ui-router": "0.4.3", 22 | "angular-uuid": "0.0.4", 23 | "angular-visjs": "4.16.0", 24 | "eslint": "4.9.0", 25 | "eslint-plugin-angular": "3.1.1", 26 | "eslint-plugin-jasmine": "2.9.1", 27 | "file-saver": "1.3.2", 28 | "jasmine": "2.8.0", 29 | "jasmine-core": "2.8.0", 30 | "js-yaml": "3.8.1", 31 | "json2yaml": "1.1.0", 32 | "karma": "1.7.1", 33 | "karma-coverage": "1.1.1", 34 | "karma-firefox-launcher": "2.1.0", 35 | "karma-jasmine": "1.1.0", 36 | "karma-ng-html2js-preprocessor": "1.0.0", 37 | "vis": "4.3.0" 38 | }, 39 | "scripts": { 40 | "test": "if [ -z $CHROME_BIN ];then export CHROME_BIN=/usr/bin/chromium-browser;fi && karma start karma.conf.js --single-run", 41 | "lint": "eslint --no-color heat_dashboard/static/dashboard/project/heat_dashboard/template_generator/js/" 42 | }, 43 | "author": "", 44 | "license": "Apache-2.0" 45 | } 46 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["pbr>=6.1.1"] 3 | build-backend = "pbr.build" 4 | -------------------------------------------------------------------------------- /releasenotes/notes/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/releasenotes/notes/.placeholder -------------------------------------------------------------------------------- /releasenotes/notes/drop-py-2-7-3dafc6e9e6f29bda.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Python 2.7 support has been dropped. Last release of heat-dashboard 5 | to support Python 2.7 is OpenStack Train. The minimum version 6 | of Python now supported by heat-dashboard is Python 3.6. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/drop-python-3-6-and-3-7-b7319859be66ed72.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Python 3.6 & 3.7 support has been dropped. The minimum version of Python now 5 | supported is Python 3.8. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/drop-python-3-8-2a8b6960c0ce7850.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Python 3.8 support was dropped. The minimum version of Python now supported 5 | is Python 3.9. 6 | -------------------------------------------------------------------------------- /releasenotes/notes/enabled_file_for_tmplgen-71432805cbfe4176.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | If you need to update your queens heat-dashboard to rocky, 5 | you must copy the latest enabled file (_1650_project_template_generator_panel.py) 6 | to horizon/openstack_dashboard/enabled directory again. 7 | The enabled file for template generator has been changed a lot in rocky and it does not have 8 | compatibility with queens heat-dashboard. 9 | The background of this change is that SCSS and xstatic modules are started to be used 10 | rather than CSS and embedded JavaScript copies to follow Horizon’s contribution rule. 11 | [`bug 1753919 `__] 12 | [`bug 1755140 `__] 13 | [`bug 1755308 `__] -------------------------------------------------------------------------------- /releasenotes/notes/policy-in-code-support-42c02d6b73e770ff.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | The default configuration file has been updated and now includes 5 | the required parameters to use the new policy-in-code feature in Horizon. 6 | Because of this change, the defualt policy.json is no longer included in 7 | this repo but replaced with policy.yaml. Please refer to the release note 8 | and documentation of Horizon to find details about this feature. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/split-out-from-horizon-1d1eabed58eb885e.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | prelude: > 3 | Heat support in OpenStack Dashboard is now split into 4 | a separated python package. 5 | features: 6 | - | 7 | Heat support in OpenStack Dashboard is now split into 8 | a separete package ``heat-dashboard``. You need to install 9 | ``heat-dashboard`` after upgrading OpenStack Dashboard 10 | to Queens release and add ``enabled`` file for Heat Dashboard. 11 | For detail information, see 12 | https://docs.openstack.org/heat-dashboard/latest/. 13 | -------------------------------------------------------------------------------- /releasenotes/notes/template-generator-panel-decc3ec172bfa1dd.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | A panel for ``Template Generator`` is newly added. There is not specific 5 | installation process. After installing heat-dashboard, this panel 6 | will be displayed along with ``Stacks``, ``Resource Types`` and 7 | ``Template Versions``. 8 | -------------------------------------------------------------------------------- /releasenotes/source/2023.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2023.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/2023.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/2023.2.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2023.2 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2023.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/2024.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2024.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2024.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/2024.2.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2024.2 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2024.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/2025.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2025.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2025.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/_static/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/releasenotes/source/_static/.placeholder -------------------------------------------------------------------------------- /releasenotes/source/_templates/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openstack/heat-dashboard/3a5b0ce39e0cc5e279d431e363a4f6f6c56015b9/releasenotes/source/_templates/.placeholder -------------------------------------------------------------------------------- /releasenotes/source/index.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | Heat Dashboard Release Notes 3 | ============================ 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | unreleased 9 | 2025.1 10 | 2024.2 11 | 2024.1 12 | 2023.2 13 | 2023.1 14 | zed 15 | yoga 16 | xena 17 | wallaby 18 | victoria 19 | ussuri 20 | train 21 | stein 22 | rocky 23 | queens 24 | -------------------------------------------------------------------------------- /releasenotes/source/locale/cs/LC_MESSAGES/releasenotes.po: -------------------------------------------------------------------------------- 1 | # Zbyněk Schwarz , 2017. #zanata 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: Heat Dashboard Release Notes\n" 5 | "Report-Msgid-Bugs-To: \n" 6 | "POT-Creation-Date: 2022-09-07 00:55+0000\n" 7 | "MIME-Version: 1.0\n" 8 | "Content-Type: text/plain; charset=UTF-8\n" 9 | "Content-Transfer-Encoding: 8bit\n" 10 | "PO-Revision-Date: 2017-11-17 09:06+0000\n" 11 | "Last-Translator: Zbyněk Schwarz \n" 12 | "Language-Team: Czech\n" 13 | "Language: cs\n" 14 | "X-Generator: Zanata 4.3.3\n" 15 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" 16 | 17 | msgid "Current Series Release Notes" 18 | msgstr "Poznámky k vydání současné verze" 19 | -------------------------------------------------------------------------------- /releasenotes/source/locale/es/LC_MESSAGES/releasenotes.po: -------------------------------------------------------------------------------- 1 | # Jose Porrua , 2016. #zanata 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: Heat Dashboard Release Notes\n" 5 | "Report-Msgid-Bugs-To: \n" 6 | "POT-Creation-Date: 2022-09-07 00:55+0000\n" 7 | "MIME-Version: 1.0\n" 8 | "Content-Type: text/plain; charset=UTF-8\n" 9 | "Content-Transfer-Encoding: 8bit\n" 10 | "PO-Revision-Date: 2016-07-26 05:38+0000\n" 11 | "Last-Translator: Jose Porrua \n" 12 | "Language-Team: Spanish\n" 13 | "Language: es\n" 14 | "X-Generator: Zanata 4.3.3\n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 16 | 17 | msgid "Current Series Release Notes" 18 | msgstr "Notas de la versión actual" 19 | 20 | msgid "New Features" 21 | msgstr "Nuevas Funcionalidades" 22 | -------------------------------------------------------------------------------- /releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po: -------------------------------------------------------------------------------- 1 | # Gaelle , 2017. #zanata 2 | # Loic Nicolle , 2017. #zanata 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: Heat Dashboard Release Notes\n" 6 | "Report-Msgid-Bugs-To: \n" 7 | "POT-Creation-Date: 2022-09-07 00:55+0000\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2017-11-14 07:50+0000\n" 12 | "Last-Translator: Gaelle \n" 13 | "Language-Team: French\n" 14 | "Language: fr\n" 15 | "X-Generator: Zanata 4.3.3\n" 16 | "Plural-Forms: nplurals=2; plural=(n > 1)\n" 17 | 18 | msgid "Current Series Release Notes" 19 | msgstr "Notes sur la Release Actuelle" 20 | 21 | msgid "New Features" 22 | msgstr "Nouvelles fonctionnalités" 23 | -------------------------------------------------------------------------------- /releasenotes/source/queens.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Queens Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/queens 7 | -------------------------------------------------------------------------------- /releasenotes/source/rocky.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Rocky Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/rocky 7 | -------------------------------------------------------------------------------- /releasenotes/source/stein.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Stein Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/stein 7 | -------------------------------------------------------------------------------- /releasenotes/source/train.rst: -------------------------------------------------------------------------------- 1 | ========================== 2 | Train Series Release Notes 3 | ========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/train 7 | -------------------------------------------------------------------------------- /releasenotes/source/unreleased.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Current Series Release Notes 3 | ============================== 4 | 5 | .. release-notes:: 6 | -------------------------------------------------------------------------------- /releasenotes/source/ussuri.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | Ussuri Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/ussuri 7 | -------------------------------------------------------------------------------- /releasenotes/source/victoria.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Victoria Series Release Notes 3 | ============================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/victoria 7 | -------------------------------------------------------------------------------- /releasenotes/source/wallaby.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | Wallaby Series Release Notes 3 | ============================ 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/wallaby 7 | -------------------------------------------------------------------------------- /releasenotes/source/xena.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | Xena Series Release Notes 3 | ========================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/xena 7 | -------------------------------------------------------------------------------- /releasenotes/source/yoga.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | Yoga Series Release Notes 3 | ========================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/yoga 7 | -------------------------------------------------------------------------------- /releasenotes/source/zed.rst: -------------------------------------------------------------------------------- 1 | ======================== 2 | Zed Series Release Notes 3 | ======================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/zed 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Requirements lower bounds listed here are our best effort to keep them up to 2 | # date but we do not test them so no guarantee of having them all correct. If 3 | # you find any incorrect lower bounds, let us know or propose a fix. 4 | 5 | pbr>=5.5.0 # Apache-2.0 6 | python-heatclient>=1.10.0 # Apache-2.0 7 | 8 | # This will be installed from git in OpenStack CI if the job setting 9 | # required-projects for horizon: 10 | horizon>=25.0.0 # Apache-2.0 11 | 12 | xstatic-angular-uuid>=0.0.4.0 # MIT 13 | xstatic-angular-vis>=4.16.0.0 # MIT 14 | xstatic-filesaver>=1.3.2.0 # MIT 15 | xstatic-js-yaml>=3.8.1.0 # MIT 16 | xstatic-json2yaml>=0.1.1.0 # MIT 17 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = heat-dashboard 3 | summary = Heat Management Dashboard 4 | description_file = 5 | README.rst 6 | license = Apache-2.0 7 | author = OpenStack 8 | author_email = openstack-discuss@lists.openstack.org 9 | home_page = https://docs.openstack.org/heat-dashboard/latest/ 10 | python_requires = >=3.9 11 | classifier = 12 | Environment :: OpenStack 13 | Intended Audience :: Information Technology 14 | Intended Audience :: System Administrators 15 | Operating System :: POSIX :: Linux 16 | Programming Language :: Python 17 | Programming Language :: Python :: Implementation :: CPython 18 | Programming Language :: Python :: 3 :: Only 19 | Programming Language :: Python :: 3 20 | Programming Language :: Python :: 3.9 21 | Programming Language :: Python :: 3.10 22 | Programming Language :: Python :: 3.11 23 | Programming Language :: Python :: 3.12 24 | 25 | [files] 26 | packages = 27 | heat_dashboard 28 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2013 Hewlett-Packard Development Company, L.P. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 | # implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | import setuptools 17 | 18 | setuptools.setup( 19 | setup_requires=['pbr>=2.0.0'], 20 | pbr=True) 21 | -------------------------------------------------------------------------------- /test-requirements.txt: -------------------------------------------------------------------------------- 1 | hacking>=6.1.0,<6.2.0 # Apache-2.0 2 | 3 | coverage>=4.0 # Apache-2.0 4 | flake8-import-order>=0.18.0,<0.19.0 # LGPLv3 5 | nodeenv>=0.9.4 # BSD 6 | testtools>=2.2.0 # MIT 7 | 8 | # integration tests requirements 9 | selenium>=2.50.1 # Apache-2.0 10 | xvfbwrapper>=0.1.3 #license: MIT 11 | --------------------------------------------------------------------------------