Exemple #1
0
def validate_service_type(service_type):
    from django.core.exceptions import ValidationError
    if not SupportedServices.has_service_type(service_type):
        raise ValidationError(_('Invalid service type.'))
    def setup(self):
        self.stdout.write(self.style.MIGRATE_HEADING('Preparation:'))
        self.base_url = (raw_input(
            'Please enter NodeConductor base URL [http://127.0.0.1:8000]:')
                         or 'http://127.0.0.1:8000')

        self.stdout.write(
            'Steps for SugarCRM setup:\n'
            ' 1. Create SugarCRM MO Customer and Project.\n'
            ' 2. Create Owner for SugarCRM MO Customer.\n'
            ' 3. Create OpenStack service settings and OpenStack service.\n'
            ' 4. Create Zabbix service settings and Zabbix service (optional).\n'
            ' 5. Create Template Group for OpenStack instance + Zabbix host.\n'
            ' 6. Create Service settings for SugarCRM.\n'
            ' 7. Create SugarCRM template.\n')

        self.stdout.write(
            self.style.MIGRATE_HEADING(
                'Step 1: SugarCRM MO Customer and Project'))
        # customer
        customer_name = raw_input(
            '  Enter customer name [SugarCRM MO customer]:'
        ) or 'SugarCRM MO customer'
        customer = structure_models.Customer.objects.create(name=customer_name)
        self.created_instances.append(customer)
        customer_detail_url = self._get_admin_detail_url(customer)
        self.stdout.write(
            '  Customer was created with given name. You can edit its details here: {}'
            .format(customer_detail_url))
        # project
        project_name = raw_input('  Enter project name [SugarCRM MO project]:'
                                 ) or 'SugarCRM MO project'
        project = structure_models.Project.objects.create(name=project_name,
                                                          customer=customer)
        self.created_instances.append(project)
        project_detail_url = self._get_admin_detail_url(project)
        self.stdout.write(
            '  Project was created with given name. You can edit its details here: {}'
            .format(project_detail_url))

        self.stdout.write(
            self.style.MIGRATE_HEADING(
                'Step 2: Owner for SugarCRM MO Customer'))
        # user
        while True:
            username = raw_input(
                '  Enter username of SugarCRM customer owner [SugarCRM user]:'
            ) or 'SugarCRM user'
            if get_user_model().objects.filter(username=username).exists():
                self.stdout.write(
                    '  User with such username already exists. Please choose another one.'
                )
            else:
                break
        password = raw_input(
            '  Enter password of SugarCRM customer owner [password]:'
        ) or 'password'
        user = get_user_model().objects.create_user(username=username,
                                                    password=password)
        self.created_instances.append(user)
        customer.add_user(user, structure_models.CustomerRole.OWNER)
        user_detail_url = self._get_admin_detail_url(user)
        self.stdout.write(
            '  Customer owner was created successfully, you can edit his details here: {}'
            .format(user_detail_url))

        self.stdout.write(
            self.style.MIGRATE_HEADING(
                'Step 3: Owner for SugarCRM MO Customer'))
        # OpenStack service settings
        openstack_settings_name = (raw_input(
            '  Enter OpenStack service settings name [SugarCRM MO OpenStack settings]:'
        ) or 'SugarCRM MO OpenStack settings')
        openstack_settings_url = self._get_admin_add_url(
            structure_models.ServiceSettings)
        defaults = {
            'customer': customer.id,
            'type': 'OpenStack',
            'name': openstack_settings_name,
            'shared': ''
        }
        openstack_settings_url += '?' + urllib.urlencode(defaults)
        self.stdout.write(
            '  Go to URL: {} and create new OpenStack service settings'.format(
                openstack_settings_url))
        while True:
            openstack_settings_id = raw_input(
                '  Enter created service settings id:')
            try:
                openstack_settings = structure_models.ServiceSettings.objects.get(
                    id=openstack_settings_id)
            except (structure_models.ServiceSettings.DoesNotExist, ValueError):
                self.stdout.write(
                    '  There is no service settings with given id, please try again.'
                )
            else:
                self.created_instances.append(openstack_settings)
                self.stdout.write(
                    '  ServiceSettings was created successfully.')
                break
        # OpenStack service
        openstack_service_name = (
            raw_input('  Enter OpenStack service name [SugarCRM MO service]:')
            or 'SugarCRM MO service')
        openstack_service = openstack_models.OpenStackService.objects.create(
            settings=openstack_settings,
            name=openstack_service_name,
            customer=customer,
            available_for_all=True)
        self.created_instances[-1] = openstack_service
        self.stdout.write('  OpenStack service was created successfully.')

        if not SupportedServices.has_service_type('Zabbix'):
            self.stdout.write('Step 4: Skipped. Zabbix is not installed')
            is_zabbix_enabled = False
        else:
            from nodeconductor_zabbix import models as zabbix_models
            is_zabbix_enabled = True
            self.stdout.write(
                self.style.MIGRATE_HEADING(
                    'Step 4: Create Zabbix service settings and Zabbix service'
                ))
            # Zabbix service settings
            zabbix_settings_name = (raw_input(
                '  Enter Zabbix service settings name [SugarCRM MO Zabbix settings]:'
            ) or 'SugarCRM MO Zabbix settings')
            zabbix_settings_url = self._get_admin_add_url(
                structure_models.ServiceSettings)
            defaults = {
                'customer': customer.id,
                'type': 'Zabbix',
                'name': zabbix_settings_name,
                'shared': ''
            }
            zabbix_settings_url += '?' + urllib.urlencode(defaults)
            self.stdout.write(
                '  Go to URL: {} and create new OpenStack service settings'.
                format(zabbix_settings_url))
            while True:
                zabbix_settings_id = raw_input(
                    '  Enter created service settings id:')
                try:
                    zabbix_settings = structure_models.ServiceSettings.objects.get(
                        id=zabbix_settings_id)
                except (structure_models.ServiceSettings.DoesNotExist,
                        ValueError):
                    self.stdout.write(
                        '  There is no service settings with given id, please try again.'
                    )
                else:
                    self.created_instances.append(zabbix_settings)
                    self.stdout.write(
                        '  ServiceSettings was created successfully.')
                    break
            # Zabbix service
            zabbix_service_name = raw_input(
                '  Enter Zabbix service name [SugarCRM MO service]:'
            ) or 'SugarCRM MO service'
            zabbix_service = zabbix_models.ZabbixService.objects.create(
                settings=zabbix_settings,
                name=zabbix_service_name,
                customer=customer,
                available_for_all=True)
            self.created_instances[-1] = zabbix_service
            self.stdout.write('  Zabbix service was created successfully.')

        self.stdout.write(
            self.style.MIGRATE_HEADING(
                'Step 5: Template Group for OpenStack instance + Zabbix host'))
        # internal template group
        while True:
            template_group_name = (raw_input(
                '  Enter internal template group name [SugarCRM internal]:')
                                   or 'SugarCRM internal')
            if template_models.TemplateGroup.objects.filter(
                    name=template_group_name).exists():
                self.stdout.write(
                    self.style.NOTICE(
                        '  Template group with such name already exists. Enter another one.'
                    ))
            else:
                break
        template_group = template_models.TemplateGroup.objects.create(
            name=template_group_name)
        template_group.tags.add('internal')
        self.created_instances.append(template_group)
        # OpenStack instance template
        project_url = self.base_url + reverse('project-detail',
                                              args=(project.uuid.hex, ))
        service_url = self.base_url + reverse(
            'openstack-detail', args=(openstack_service.uuid.hex, ))
        instance_template = template_group.templates.create(
            order_number=1,
            resource_content_type=ContentType.objects.get_for_model(
                openstack_models.Instance),
            options={
                'project': project_url,
                'service': service_url
            })
        self.created_instances.append(instance_template)
        template_group_detail_url = self._get_admin_detail_url(template_group)
        self.stdout.write(
            '  Base OpenStack template group was created successfully.')
        while True:
            required_fields = 'flavor', 'image', 'system_volume_size', 'security_groups', 'data_volume_size'
            self.stdout.write(
                '  Please go to URL {} and define {} for OpenStack instance template'
                .format(', '.join(required_fields), template_group_detail_url))
            raw_input('  Press enter to continue')
            instance_template = template_group.templates.get(
                id=instance_template.id)
            instance_template_valid = True
            for field in required_fields:
                if field not in instance_template.options:
                    self.stdout.write(
                        self.style.NOTICE(
                            '  Field {} has to be defined in OpenStack instance template'
                            .format(field)))
                    instance_template_valid = False
            if instance_template_valid:
                break
        self.stdout.write(
            '  OpenStack instance template was created successfully.')
        # Zabbix template
        if is_zabbix_enabled:
            service_url = self.base_url + reverse(
                'zabbix-detail', args=(zabbix_service.uuid.hex, ))
            host_template = template_group.templates.create(
                order_number=2,
                resource_content_type=ContentType.objects.get_for_model(
                    zabbix_models.Host),
                options={
                    'name': '{{ response.backend_id }}',
                    'visible_name': '{{ response.name }}',
                    'scope': '{{ response.url }}',
                    'project': project_url,
                    'service': service_url
                })
            self.created_instances.append(host_template)
        self.stdout.write('  Zabbix host template was created successfully.')
        self.stdout.write(
            '  Internal template group with templates was created successfully.'
        )

        self.stdout.write(
            self.style.MIGRATE_HEADING(
                'Step 6: Service settings for SugarCRM'))
        # SugarCRM service settings
        sugarcrm_settings_name = (raw_input(
            '  Enter SugarCRM service settings name [SugarCRM settings]:')
                                  or 'SugarCRM settings')
        license_code = raw_input('  Enter SugarCRM license code:')
        protocol = raw_input(
            '  Enter SugarCRM CRMs protocol [http]:') or 'http'
        while True:
            shared = raw_input('  Make settings shared? [Y/n]:') or 'y'
            if shared.lower() not in ('y', 'n'):
                self.stdout.write('  Please enter letter "y" or "n"')
            else:
                shared = shared.lower() == 'y'
                break
        tg_url = self.base_url + reverse('template-group-detail',
                                         args=(template_group.uuid.hex, ))
        sugarcrm_settings = structure_models.ServiceSettings.objects.create(
            name=sugarcrm_settings_name,
            backend_url=tg_url,
            username=username,
            password=password,
            type='SugarCRM',
            shared=shared,
            options={
                'license_code': license_code,
                'protocol': protocol
            })
        self.created_instances.append(sugarcrm_settings)
        settings_admin_url = self._get_admin_detail_url(sugarcrm_settings)
        self.stdout.write(
            '  SugarCRM service settings was created successfully, you can edit them details here: {}'
            .format(settings_admin_url))

        self.stdout.write(
            self.style.MIGRATE_HEADING('Step 7: SugarCRM template group'))
        # external template group
        while True:
            template_group_name = raw_input(
                '  Enter SugarCRM external template group name [SugarCRM]:'
            ) or 'SugarCRM'
            if template_models.TemplateGroup.objects.filter(
                    name=template_group_name).exists():
                self.stdout.write(
                    self.style.NOTICE(
                        '  Template group with such name already exists. Enter another one.'
                    ))
            else:
                break
        template_group = template_models.TemplateGroup.objects.create(
            name=template_group_name)
        template_group.tags.add('SaaS')
        self.created_instances.append(template_group)
        # templates for template group
        settings_url = self.base_url + reverse(
            'servicesettings-detail', args=(sugarcrm_settings.uuid.hex, ))
        template = template_group.templates.create(
            order_number=1,
            resource_content_type=ContentType.objects.get_for_model(CRM),
            options={'service_settings': settings_url})
        self.created_instances.append(template)
        template_group_admin_url = self._get_admin_detail_url(template_group)
        self.stdout.write(
            '  External template group with templates was created successfully, you can edit its details '
            'here: {}'.format(template_group_admin_url))
        self.stdout.write(
            self.style.MIGRATE_HEADING(
                'SugarCRM setup was finished successfully.'))
        template_group_url = self.base_url + reverse(
            'template-group-detail', args=(template_group.uuid.hex, ))
        self.stdout.write(
            'To test SugarCRM setup try to execute POST request against {} '
            '("name" and "project" parameters are required)'.format(
                template_group_url + 'provision/'))