Beispiel #1
0
def check_cleanup_executors(app_configs, **kwargs):
    errors = []

    for extension in NodeConductorExtension.get_extensions():
        cleanup_executor = extension.get_cleanup_executor()
        if not cleanup_executor:
            continue

        for model in cleanup_executor.pre_models:
            if not issubclass(model, Model):
                errors.append(
                    checks.Error(
                        'Invalid resource model is detected in project cleanup executor.',
                        obj=cleanup_executor,
                        id='waldur.E001',
                    )
                )

        for item in cleanup_executor.executors:
            if not is_valid_executor(item):
                errors.append(
                    checks.Error(
                        'Invalid resource executor is detected in project cleanup executor.',
                        obj=cleanup_executor,
                        id='waldur.E001',
                    )
                )

    return errors
Beispiel #2
0
    def sync(self, request):
        if NodeConductorExtension.is_installed('nodeconductor_killbill'):
            send_task('killbill', 'sync_pricelist')()
            self.message_user(request, "Price lists scheduled for sync")
        else:
            self.message_user(request, "Unknown billing backend. Can't sync", level=messages.ERROR)

        return redirect(reverse('admin:cost_tracking_defaultpricelistitem_changelist'))
Beispiel #3
0
    def __init__(self, **kwargs):
        FluentIndexDashboard.__init__(self, **kwargs)
        self.children.append(
            modules.Group(
                title="IaaS",
                display="tabs",
                children=[
                    modules.ModelList(
                        title='Network',
                        models=(
                            'nodeconductor.iaas.models.FloatingIP',
                            'nodeconductor.iaas.models.IpMapping',
                            'nodeconductor.iaas.models.SecurityGroup',
                        )),
                    modules.ModelList(
                        title='Virtual Machine',
                        models=(
                            'nodeconductor.iaas.models.Instance',
                            'nodeconductor.iaas.models.InstanceSlaHistory',
                            'nodeconductor.iaas.models.Template',
                            'nodeconductor.iaas.models.TemplateLicense',
                        )),
                    modules.ModelList(
                        title='Cloud',
                        models=(
                            'nodeconductor.iaas.models.Cloud',
                            'nodeconductor.iaas.models.CloudProjectMembership',
                            'nodeconductor.iaas.models.OpenStackSettings',
                        ))
                ]))

        billing_models = ['nodeconductor.cost_tracking.*']
        if NodeConductorExtension.is_installed('nodeconductor_killbill'):
            billing_models.append('nodeconductor_killbill.models.Invoice')
        if NodeConductorExtension.is_installed('nodeconductor_paypal'):
            billing_models.append('nodeconductor_paypal.models.Payment')

        self.children.append(AppIconList(_('Billing'), models=billing_models))
        self.children.append(
            AppIconList(_('Structure'),
                        models=('nodeconductor.structure.*', )))
        self.children.append(
            AppIconList(_('Backup'), models=('nodeconductor.backup.*', )))
Beispiel #4
0
    def get_executors(cls):
        # Get cleanup executors from extensions
        executors = [
            extension.get_cleanup_executor()
            for extension in NodeConductorExtension.get_extensions()
        ]

        # Filter empty items from list because cleanup executor is optional
        executors = [executor for executor in executors if executor]

        # Apply topological sort with respect to dependencies between executors
        dependencies = {}
        for executor in executors:
            dependencies[executor] = set()
            if executor.related_executor:
                dependencies[executor.related_executor].add(executor)
        return stable_topological_sort(executors, dependencies)
Beispiel #5
0
    def subscribe_resources(self, request):
        if NodeConductorExtension.is_installed('nodeconductor_killbill'):
            from nodeconductor_killbill.backend import KillBillBackend, KillBillError

            erred_resources = []
            subscribed_resources = []
            for model in structure_models.PaidResource.get_all_models():
                for resource in model.objects.exclude(
                        state=model.States.ERRED):
                    try:
                        backend = KillBillBackend(resource.customer)
                        backend.subscribe(resource)
                    except KillBillError:
                        erred_resources.append(resource)
                    else:
                        subscribed_resources.append(resource)

            if subscribed_resources:
                subscribed_resources_count = len(subscribed_resources)
                message = ungettext(
                    'One resource subscribed',
                    '%(subscribed_resources_count)d resources subscribed',
                    subscribed_resources_count)
                message = message % {
                    'subscribed_resources_count': subscribed_resources_count
                }
                self.message_user(request, message)

            if erred_resources:
                message = gettext(
                    'Failed to subscribe resources: %(erred_resources)s')
                message = message % {
                    'erred_resources': ', '.join(
                        [i.name for i in erred_resources])
                }
                self.message_user(request, message, level=messages.ERROR)

        else:
            self.message_user(request,
                              "Unknown billing backend. Can't sync",
                              level=messages.ERROR)

        return redirect(
            reverse('admin:cost_tracking_defaultpricelistitem_changelist'))
Beispiel #6
0
    def _get_installed_plugin_info(self):
        links = []

        for ext in NodeConductorExtension.get_extensions():
            app_config = self._get_app_config(ext.django_app())
            if not app_config:
                # App is not found
                continue

            name = self._get_app_name(app_config)
            version = self._get_app_version(app_config)

            links.append({
                'title': '%s %s' % (name, version),
                'url': 'http://docs.waldur.com/',
                'external': True,
                'attrs': {
                    'target': '_blank'
                },
            })

        # Order plugins by title
        links = sorted(links, key=lambda item: item['title'].lower())

        # Core is the most important component, therefore
        # it should be the the first item in the list
        links.insert(
            0, {
                'title': _('Waldur Core %s') % __version__,
                'url': 'http://docs.waldur.com/',
                'external': True,
                'attrs': {
                    'target': '_blank'
                },
            })

        return links
Beispiel #7
0
router = DefaultRouter()
cost_tracking_urls.register_in(router)
logging_urls.register_in(router)
monitoring_urls.register_in(router)
quotas_urls.register_in(router)
structure_urls.register_in(router)
users_urls.register_in(router)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^admintools/', include('admin_tools.urls')),
]

if settings.NODECONDUCTOR.get('EXTENSIONS_AUTOREGISTER'):
    for ext in NodeConductorExtension.get_extensions():
        if ext.django_app() in settings.INSTALLED_APPS:
            urlpatterns += ext.django_urls()
            ext.rest_urls()(router)

urlpatterns += [
    url(r'^docs/', WaldurSchemaView.as_view()),
    url(r'^api/', include(router.urls)),
    url(r'^api/', include('nodeconductor.logging.urls')),
    url(r'^api/', include('nodeconductor.structure.urls')),
    url(r'^api/version/', core_views.version_detail),
    url(r'^api-auth/password/',
        core_views.obtain_auth_token,
        name='auth-password'),
    url(r'^$', TemplateView.as_view(template_name='landing/index.html')),
]
Beispiel #8
0
 def get_actions(self, request):
     actions = super(InstanceAdmin, self).get_actions(request)
     if not NodeConductorExtension.is_installed('nodeconductor_killbill'):
         if 'subscribe' in actions:
             del actions['subscribe']
     return actions