Example #1
0
def auto_allocate_asset_node(name, asset_type):
    logger.info('auto allocate {} {}'.format(name, asset_type))
    num_list = re.findall(r"\d+", name)
    if len(num_list):
        name = name[:name.index(num_list[-1])]
    logger.info('auto allocate find name {}'.format(name))
    asset = None
    if asset_type == 'ecs':
        asset = Ecs.objects.filter(instance_name__contains=name).exclude(
            Q(nodes=None) | Q(nodes__key='1')).first()
    elif asset_type == 'slb':
        asset = Slb.objects.filter(instance_name__contains=name).exclude(
            Q(nodes=None) | Q(nodes__key='1')).first()
    elif asset_type == 'kvstore':
        asset = KvStore.objects.filter(instance_name__contains=name).exclude(
            Q(nodes=None) | Q(nodes__key='1')).first()
    elif asset_type == 'oss':
        asset = Oss.objects.filter(instance_name__contains=name).exclude(
            Q(nodes=None) | Q(nodes__key='1')).first()
    elif asset_type == 'rds':
        asset = Rds.objects.filter(instance_name__contains=name).exclude(
            Q(nodes=None) | Q(nodes__key='1')).first()
    else:
        pass
    if asset:
        node = asset.nodes.exclude(key='1').first()
        if node:
            logger.info('auto allocate {} to {}'.format(name, node.value))
            return node
        else:
            logger.info('auto allocate {} to root node'.format(name))
            return Node.root()
    else:
        logger.info('auto allocate {} to root node'.format(name))
        return Node.root()
Example #2
0
 def get_context_data(self, **kwargs):
     Node.root()
     context = {
         'app': _('Assets'),
         'action': _('Asset list'),
         'labels': Label.objects.all().order_by('name'),
         'nodes': Node.objects.all().order_by('-key'),
     }
     kwargs.update(context)
     return super().get_context_data(**kwargs)
Example #3
0
    def filter_node(self, queryset):
        unallocated = self.request.query_params.get("unallocated")
        if unallocated:
            queryset = queryset.annotate(num_nodes=Count('nodes'))
            queryset = queryset.filter((Q(num_nodes=0)) | (Q(nodes=Node.root())
                                                           & Q(num_nodes=1)))
            return queryset
        node_id = self.request.query_params.get("node_id")
        if not node_id:
            return queryset

        node = get_object_or_404(Node, id=node_id)
        show_current_asset = self.request.query_params.get(
            "show_current_asset") in ('1', 'true')

        if node.is_root() and show_current_asset:
            queryset = queryset.filter(
                Q(nodes=node_id) | Q(nodes__isnull=True))
        elif node.is_root() and not show_current_asset:
            pass
        elif not node.is_root() and show_current_asset:
            queryset = queryset.filter(nodes=node)
        else:
            queryset = queryset.filter(
                nodes__key__regex='^{}(:[0-9]+)*$'.format(node.key), )
        return queryset
Example #4
0
def default_node():
    try:
        from assets.models import Node
        root = Node.root()
        return root
    except:
        return None
Example #5
0
 def set_assets_node(self, assets):
     if not isinstance(assets, list):
         assets = [assets]
     node = Node.root()
     node_id = self.request.query_params.get('node_id')
     if node_id:
         node = get_object_or_none(Node, pk=node_id)
     node.assets.add(*assets)
Example #6
0
 def perform_update(self, serializer):
     assets = serializer.validated_data.get('assets')
     instance = self.get_object()
     if instance != Node.root():
         instance.kvstore.remove(*tuple(assets))
     else:
         assets = [asset for asset in assets if asset.nodes.count() > 1]
         instance.kvstore.remove(*tuple(assets))
Example #7
0
 def get_form(self, form_class=None):
     form = super().get_form(form_class=form_class)
     node_id = self.request.GET.get("node_id")
     if node_id:
         node = get_object_or_none(Node, id=node_id)
     else:
         node = Node.root()
     form['nodes'].initial = node
     return form
Example #8
0
def sync_oss_list_info_manual():
    logger.info('ready to sync aly cloud oss list')
    ali_util = AliCloudUtil()
    created, updated, failed = [], [], []
    node = Node.root()
    Oss.objects.all().update(status='Destory')
    for info in ali_util.get_oss_instances():
        logger.info(json.dumps(info))
        oss = get_object_or_none(Oss, instance_id=info.get('instance_id'))
        if not oss:
            try:
                with transaction.atomic():
                    oss = Oss.objects.create(**info)
                    # need to add auto join node
                    node = auto_allocate_asset_node(info.get('instance_name'),
                                                    'oss')
                    oss.nodes.set([node])
                    created.append(info['instance_name'])
            except Exception as e:
                failed.append('%s: %s' % (info['instance_name'], str(e)))
        else:
            for k, v in info.items():
                if v != '':
                    setattr(oss, k, v)
            try:
                if not oss.nodes.exclude(key='1').first():
                    logger.info('update node for root node oss')
                    node = auto_allocate_asset_node(info.get('instance_name'),
                                                    'oss')
                    oss.nodes.set([node])
                oss.save()
                updated.append(info['instance_name'])
            except Exception as e:
                failed.append('%s: %s' % (info['instance_name'], str(e)))

    data = {
        'created':
        created,
        'created_info':
        'Created {}'.format(len(created)),
        'updated':
        updated,
        'updated_info':
        'Updated {}'.format(len(updated)),
        'failed':
        failed,
        'failed_info':
        'Failed {}'.format(len(failed)),
        'valid':
        True,
        'msg':
        'Created: {}. Updated: {}, Error: {}'.format(len(created),
                                                     len(updated), len(failed))
    }
    logger.info('sync finish')
    logger.info(json.dumps(data))
    return data
Example #9
0
 def get_queryset(self):
     node_key = self.request.query_params.get('key')
     if node_key:
         self.node = Node.objects.get(key=node_key)
         queryset = self.node.get_children(with_self=False)
     else:
         self.is_root = True
         self.node = Node.root()
         queryset = list(self.node.get_children(with_self=True))
         nodes_invalid = Node.objects.exclude(key__startswith=self.node.key)
         queryset.extend(list(nodes_invalid))
     queryset = [self.as_tree_node(node) for node in queryset]
     queryset = sorted(queryset)
     return queryset
Example #10
0
 def get_nodes(self):
     from assets.models import Node
     nodes = self.nodes.all() or [Node.root()]
     return nodes
Example #11
0
    def form_valid(self, form):
        sync_time = datetime.datetime.now()
        account_id = self.request.GET.get("account_id")

        # Will create ROOT node while user first time importing assets.
        if not get_object_or_none(Node, key="1"):
            Node.root()

        try:
            account_id = account_id if account_id else form.cleaned_data['account_id']
            account_id = ''.join(account_id.split("-"))
            hostname_map = json.loads(form.cleaned_data["hostname_map"])

            if not hostname_map:
                data = {'valid': False, 'msg': _('Did not selected any assets')}
                return self.render_to_response(data)
        except Exception as e:
            data = {'valid': False,
                    'msg': _("some error,reason {error}".format(**{"error":str(e)}))}
            return self.render_to_response(data)

        ak = get_object_or_none(CloudAccount, id=account_id)
        if ak is None:
            pass

        ak.last_sync_time = sync_time
        ak.save()

        account_name = ak.name
        cloud_name = ak.cloud_provider
        cloud_node = create_cloud_node(cloud_name, account_id,account_name)

        created, updated, failed = [], [], []
        instances = cache.get(account_id, [])
        if instances:
            for instance in instances:
                for res_ins in hostname_map:
                    if res_ins["number"] == instance["InstanceId"]:
                        projectID = get_projectId(cloud_name, instance)
                        project_node_key = create_project_node(cloud_node, projectID)

                        asset_dict = genernate_asset_dic(cloud_name, instance)
                        asset = None
                        asset_id = asset_dict.pop('id', None)
                        if asset_id:
                            asset = get_object_or_none(Asset, id=asset_id)

                        if not asset:
                            try:
                                if len(Asset.objects.filter(number=asset_dict.get('number'))):
                                    raise Exception(_('already exists'))
                                with transaction.atomic():
                                    asset = Asset.objects.create(**asset_dict)
                                    assign_asset_to_node(project_node_key, asset_dict["hostname"])
                                    created.append(asset_dict['hostname'])
                            except Exception as e:
                                failed.append('%s: %s' % (asset_dict['hostname'], str(e)))
                        else:
                            for k, v in asset_dict.items():
                                if v != '':
                                    setattr(asset, k, v)
                            try:
                                asset.save()
                                updated.append(asset_dict['hostname'])
                            except Exception as e:
                                failed.append('%s: %s' % (asset_dict['hostname'], str(e)))
                    else:
                        continue

            data = {
                'created': created,
                'created_info': 'Created {}'.format(len(created)),
                'updated': updated,
                'updated_info': 'Updated {}'.format(len(updated)),
                'failed': failed,
                'failed_info': 'Failed {}'.format(len(failed)),
                'valid': True,
                'msg': 'Created: {}. Updated: {}, Error: {}'.format(len(created), len(updated), len(failed))
            }

            return self.render_json_response(data)

        else:
            data = {'valid': False,
                    'msg': _('No instance for this account')}
            return self.render_json_response(data)
Example #12
0
def sync_dc2_list_info_manual():
    logger.info('ready to sync didi cloud dc2 list')
    didi_util = DiDiCloudUtil()
    created, updated, failed = [], [], []
    j_created, j_updated, j_failed = [], [], []
    node = Node.root()
    Dc2.objects.all().update(status='Destory')
    for info in didi_util.get_dc2_instances():
        logger.info(json.dumps(info))
        dc2 = get_object_or_none(Dc2, instance_id=info.get('instance_id'))
        if not dc2:
            try:
                with transaction.atomic():
                    dc2 = Dc2.objects.create(**info)
                    node = auto_allocate_asset_node(info.get('instance_name'), 'dc2')
                    # need to add auto join node
                    dc2.nodes.set([node])
                    created.append(info['instance_name'])
            except Exception as e:
                failed.append('%s: %s' % (info['instance_name'], str(e)))
        else:
            for k, v in info.items():
                if v != '':
                    setattr(dc2, k, v)
            try:
                if not dc2.nodes.exclude(key='1').first():
                    logger.info('update node for root node dc2')
                    node = auto_allocate_asset_node(info.get('instance_name'), 'dc2')
                    dc2.nodes.set([node])
                dc2.save()
                updated.append(info['instance_name'])
            except Exception as e:
                failed.append('%s: %s' % (info['instance_name'], str(e)))

        if settings.AUTO_UPDATE_JUMPSERVER_ASSETS:
            asset = get_object_or_none(JAssets, number=info.get('instance_id'))
            if not asset:
                try:
                    with transaction.atomic():
                        hostname = info.get('instance_name')
                        admin_user, domain = auto_get_admin_and_domain(hostname)
                        attr = {
                            'number': info.get('instance_id'),
                            'ip': info.get('inner_ip'),
                            'port': 3299,
                            'protocol': 'ssh',
                            'protocols': 'ssh/3299',
                            'hostname': hostname,
                            'platform': 'Linux',
                            'domain': domain,
                            'admin_user': admin_user
                        }
                        asset = JAssets.objects.create(**attr)
                        # need to add auto join node
                        asset.nodes.set([node])
                        j_created.append(info['instance_name'])
                except Exception as e:
                    j_failed.append('%s: %s' % (info['instance_name'], str(e)))
            else:
                setattr(asset, 'hostname', info.get('instance_name'))
                setattr(asset, 'ip', info.get('inner_ip'))
                try:
                    asset.save()
                    j_updated.append(info['instance_name'])
                except Exception as e:
                    j_failed.append('%s: %s' % (info['instance_name'], str(e)))

    data = {
        'created': created,
        'created_info': 'Created {}'.format(len(created)),
        'updated': updated,
        'updated_info': 'Updated {}'.format(len(updated)),
        'failed': failed,
        'failed_info': 'Failed {}'.format(len(failed)),
        'valid': True,
        'msg': 'Created: {}. Updated: {}, Error: {}'.format(
            len(created), len(updated), len(failed))
    }
    logger.info('dc2 sync finish')
    logger.info(json.dumps(data))

    if settings.AUTO_UPDATE_JUMPSERVER_ASSETS:
        clean_destory_assets_in_jumpserver()
        j_data = {
            'created': j_created,
            'created_info': 'Created {}'.format(len(j_created)),
            'updated': j_updated,
            'updated_info': 'Updated {}'.format(len(j_updated)),
            'failed': j_failed,
            'failed_info': 'Failed {}'.format(len(j_failed)),
            'valid': True,
            'msg': 'Created: {}. Updated: {}, Error: {}'.format(
                len(j_created), len(j_updated), len(j_failed))
        }
        logger.info('jump server asset update finish')
        logger.info(json.dumps(j_data))
    return data
Example #13
0
def sync_ecs_list_info_manual():
    logger.info('ready to sync aly cloud ecs list')
    ali_util = AliCloudUtil()
    result = ali_util.get_ecs_instances()
    created, updated, failed = [], [], []
    j_created, j_updated, j_failed = [], [], []
    node = Node.root()
    Ecs.objects.all().update(status='Destory')
    for info in result:
        logger.info(json.dumps(info))
        ecs = get_object_or_none(Ecs, instance_id=info.get('instance_id'))
        if not ecs:
            try:
                with transaction.atomic():
                    ecs = Ecs.objects.create(**info)
                    node = auto_allocate_asset_node(info.get('instance_name'), 'ecs')
                    # need to add auto join node
                    ecs.nodes.set([node])
                    created.append(info['instance_name'])
            except Exception as e:
                failed.append('%s: %s' % (info['instance_name'], str(e)))
        else:
            for k, v in info.items():
                if v != '':
                    setattr(ecs, k, v)
            try:
                if not ecs.nodes.exclude(key='1').first():
                    logger.info('update node for root node ecs')
                    node = auto_allocate_asset_node(info.get('instance_name'), 'ecs')
                    ecs.nodes.set([node])
                ecs.save()
                updated.append(info['instance_name'])
            except Exception as e:
                failed.append('%s: %s' % (info['instance_name'], str(e)))

        if settings.AUTO_UPDATE_JUMPSERVER_ASSETS:
            asset = get_object_or_none(Asset, number=info.get('instance_id'))
            if not asset:
                try:
                    with transaction.atomic():
                        hostname = info.get('instance_name')
                        domain = None
                        admin_user = None
                        if settings.ENVIROMENT == 'PROD':
                            if 'ebs' in hostname:
                                domain = 'ebs'
                                admin_user = '******'
                            elif 'vip6' in hostname:
                                domain = 'vip6'
                                admin_user = '******'
                            elif 'hsb' in hostname:
                                domain = 'hsb'
                                admin_user = '******'
                            elif 'vip5' in hostname:
                                domain = 'vip5'
                                admin_user = '******'
                            elif 'usa' in hostname:
                                domain = 'osu'
                                admin_user = '******'
                            else:
                                domain = None
                                admin_user = None
                        attr = {
                            'number': 'instance_id',
                            'ip': info.get('inner_ip'),
                            'port': 3299,
                            'hostname': hostname,
                            'platform': 'Linux',
                            'domain': domain,
                            'admin_user': admin_user
                        }
                        asset = Asset.objects.create(**attr)
                        # need to add auto join node
                        asset.nodes.set([node])
                        j_created.append(info['instance_name'])
                except Exception as e:
                    j_failed.append('%s: %s' % (info['instance_name'], str(e)))
            else:
                setattr(ecs, 'hostname', info.get('hostname'))
                try:
                    asset.save()
                    j_updated.append(info['instance_name'])
                except Exception as e:
                    j_failed.append('%s: %s' % (info['instance_name'], str(e)))
    data = {
        'created': created,
        'created_info': 'Created {}'.format(len(created)),
        'updated': updated,
        'updated_info': 'Updated {}'.format(len(updated)),
        'failed': failed,
        'failed_info': 'Failed {}'.format(len(failed)),
        'valid': True,
        'msg': 'Created: {}. Updated: {}, Error: {}'.format(
            len(created), len(updated), len(failed))
    }
    logger.info('ecs sync finish')
    logger.info(json.dumps(data))
    j_data = {
        'created': j_created,
        'created_info': 'Created {}'.format(len(j_created)),
        'updated': j_updated,
        'updated_info': 'Updated {}'.format(len(j_updated)),
        'failed': j_failed,
        'failed_info': 'Failed {}'.format(len(j_failed)),
        'valid': True,
        'msg': 'Created: {}. Updated: {}, Error: {}'.format(
            len(j_created), len(j_updated), len(j_failed))
    }
    logger.info('jump server asset update finish')
    logger.info(json.dumps(j_data))

    return data