Exemplo n.º 1
0
def createstep2back(request):

    logger.info('OSイメージ作成のステップ3からステップ2へ戻る')
    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']
    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #ログインユーザのイメージの一覧を取得
    images = get_euca_info.get_image()

    message = ""
    #イメージモデルのリストを取得
    image_model_List = createImageModelList(images)

    form = ImageCreateStep2Form({
        'kernel':
        request.session['ss_img_kernel'],
        'ramdisk':
        request.session['ss_img_ramdisk'],
        'image_path':
        request.session['ss_img_imagepath']
    })
    form.fields['image_path'].update()
    form.fields['kernel'].choices = getSelectListKernelImage(image_model_List)
    form.fields['ramdisk'].choices = getSelectListRamdiskImage(
        image_model_List)

    return render_to_response('create_image_2.html', {
        'image_model_List': image_model_List,
        'form': form,
        'message': message
    },
                              context_instance=RequestContext(request))
Exemplo n.º 2
0
def countActiveMachine(login_user=None):
    """起動中/起動処理中マシンの数を取得
		input: login_user:models.User
		return: int
	"""
    count = 0

    if login_user == None:
        return 0

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)
    #ログインユーザのインスタンスの一覧を取得
    reservations = get_euca_info.get_instancelist()

    if not reservations:
        return 0

    for reservation in reservations:
        for instance in reservation.instances:
            if instance.state == u"pending" or instance.state == u"running":
                # Eucalyptus3.0では管理者(admin@eucalyptus)でも自アカウントのインスタンスのみ取得(verboseオプション無しの場合)
                count += 1


#				logger.debug("countActiveMachine:reservation.owner_id=%s" % reservation.owner_id)
#				if login_user.admin:
#					# 管理者の場合は他ユーザーのインスタンスも取得されるのでユーザーIDチェック
#					if reservation.owner_id == login_user.id:
#						count += 1
#				else:
#					count += 1

    return count
Exemplo n.º 3
0
def createform(request):
	"""作成ボタン(ボリューム)"""

	#セッションからログインユーザ情報を取得する
	login_user = request.session['ss_usr_user']

	# エラー情報
	errors = []

	logger.info('データボリュームメニュー 新規作成フォーム作成 開始')

	# 入力フォーム
	form = volume_form.VolumeCreateForm()


	#入力フォーム用Availability Zone一覧
	try:
		#Eucalyptus基盤へのアクセサを生成する
		get_euca_info=GetEucalyptusInfo(login_user)
		# Availability Zone一覧を取得
		zones = get_euca_info.get_availabilityzones()
		# Availability Zone一覧を選択リストへ設定
		zonelist = []
		for zone in zones:
			sub_zone = []
			sub_zone.append(zone.name)
			sub_zone.append(zone.name)
			zonelist.append(sub_zone)
		form.fields['zone'].choices = zonelist
		request.session['ss_vol_avalabilityzonelist'] = zonelist
	except Exception, ex:
		# Eucalyptusエラー
		errors.append("Availability Zone情報の参照に失敗しました。")
		errors.append(euca_common.get_euca_error_msg('%s' % ex))
		logger.warn(errors)
Exemplo n.º 4
0
def volume_delete(request, vol_id):
    resource_admin_auth(request)
    acc_num = None
    volume = None

    for vol in request.session['res_volumes']:
        if vol.volumeid == vol_id:
            acc_num = vol.accountnumber
            volume = vol
    if acc_num:
        euca_db = EucalyptusDB()
        usrList = euca_db.getEucalyptusUser()
        errors = []
        for usr in usrList:
            if usr.account_number == acc_num and usr.accesskey:
                try:
                    get_euca_info = GetEucalyptusInfo(usr)
                    get_euca_info.delete_volume(vol_id)
                    volume.status = "deleting"
                    request.session.modified = True

                except Exception, ex:
                    # Eucalyptusエラー
                    errors.append(euca_common.get_euca_error_msg('%s' % ex))
                    logger.warn(errors)
Exemplo n.º 5
0
def countActiveVolume(login_user=None):
    """EBSボリューム利用量を取得
		input: login_user:models.User
		return: int
	"""

    if login_user == None:
        return 0

    db_volumes = ""

    # Eucalyptus3.0では管理者(admin@eucalyptus)でも自アカウントのEBSのみ取得(verboseオプション無しの場合)
    #	if login_user.admin:
    #		#ユーザが管理者属性の場合はDBに登録されているボリュームのみを取得
    #		db_volumes = Volume.objects.filter(user_id=login_user.id).values_list('volume_id', flat=True)
    #		if not db_volumes:
    #			return 0

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)
    #ログインユーザのボリュームの一覧を取得
    volumes = get_euca_info.get_volumelist(db_volumes)

    #利用容量を集計
    total = 0
    for volume in volumes:
        total += volume.size  #サイズ

    return total
Exemplo n.º 6
0
def attach(request):
	"""取り付けボタン(ボリューム)"""

	#セッションからログインユーザ情報を取得する
	login_user = request.session['ss_usr_user']

	#セッション情報
	selected = request.session['ss_vol_volumes_selected']

	# エラー情報
	errors = []

	logger.info('データボリュームメニュー 仮想マシンへ取り付け 開始')

	#入力フォーム
	form = volume_form.VolumeAttachForm(request.POST)
	form.fields['machine'].widget.choices = request.session['ss_vol_machines']
	if not form.is_valid():
		tmp_errors = form.errors.values()
		for error in tmp_errors:
			errors.extend(error)
		logger.warn(errors)
		return render_to_response('attach_volume.html',{'form':form,'errors':errors},context_instance=RequestContext(request))

	machine = models.Machine.objects.get(pk=form.cleaned_data['machine'])
	if not machine:
		errors.append("不正な仮想マシンが選択されました。")
		logger.warn(errors)
		return render_to_response('attach_volume.html',{'form':form,'errors':errors},context_instance=RequestContext(request))

	# 取り付け先仮想マシンが起動中の場合
	if machine.instance_id:
		""" TODO:デバイス名を自動設定する
		"""
		device = form.cleaned_data['device'].encode('utf-8')
		#Eucalyptus操作
		try:
			#Eucalyptus基盤へのアクセサを生成する
			get_euca_info=GetEucalyptusInfo(login_user)

			#仮想マシンの現在ステータスを確認
			reservations = get_euca_info.get_instancelist(instance_ids=[machine.instance_id])
			if reservations:
				if reservations[0].instances[0].state == "running":

					# EBSボリュームアタッチ
					return_code = get_euca_info.attach_volume(volume_id=selected.db.volume_id, instance_id=machine.instance_id, device=device)

					if not return_code:
						errors.append("起動中の仮想マシンへのボリューム取り付けに失敗しました。")
						logger.warn(errors)
						return render_to_response('attach_volume.html',{'form':form,'errors':errors},context_instance=RequestContext(request))

					""" TODO:アタッチ状況が"attaching"->"attached"へ遷移するのを確認する"""

		except Exception, ex:
			# Eucalyptusエラー
			errors.append(euca_common.get_euca_error_msg('%s' % ex))
			logger.warn(errors)
			return render_to_response('attach_volume.html',{'form':form,'errors':errors},context_instance=RequestContext(request))
Exemplo n.º 7
0
def delete(request, groupname):
    """ファイアウォール削除"""

    logger.info('ファイアウォール 削除')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    # エラー情報
    errors = []

    #セキュリティグループ削除(Eucalyptus操作)
    try:
        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)

        #セキュリティグループ削除
        security_group = get_euca_info.delete_securitygroup(name=groupname)

    except Exception, ex:
        # Eucalyptusエラー
        errors.append("ファイアウォール削除に失敗しました。")
        errors.append(euca_common.get_euca_error_msg('%s' % ex))
        return render_to_response('securitygroup_list.html',
                                  {'errors': errors},
                                  context_instance=RequestContext(request))
Exemplo n.º 8
0
def createstep1(request):

    logger.info('OSイメージ作成のステップ1')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']
    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #ログインユーザのイメージの一覧を取得
    images = get_euca_info.get_image()

    #イメージモデルのリストを取得
    image_model_List = createImageModelList(images)

    form = ImageCreateStep1Form({'imagetype': 'machine'})

    imagetype_tuple = [('machine', '仮想OSイメージ'), ('ramdisk', 'ラムディスクイメージ'),
                       ('kernel', 'カーネルイメージ')]

    form.fields['imagetype'].choices = imagetype_tuple

    request.session['ss_img_imagetype'] = imagetype_tuple

    message = ""

    return render_to_response('create_image_1.html', {
        'image_model_List': image_model_List,
        'form': form,
        'message': message
    },
                              context_instance=RequestContext(request))
Exemplo n.º 9
0
def countAssociatedAddress(login_user=None):
    """関連付け済みIPアドレスの数を取得
		input: login_user:models.User
		return: int
	"""
    count = 0
    if login_user == None:
        return 0

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)
    #ログインユーザのIPアドレス一覧を取得
    addresslist = get_euca_info.get_addresslist()

    # IPアドレス数集計
    if login_user.account_id == "eucalyptus":
        #if login_user.admin:
        # 管理者の場合は全IPアドレスが表示されるのでフィルタ
        # インスタンスIDパターン(管理者の場合、インスタンスへ取り付け済み)
        INSTANCE_ID_PTN_MINE_USED = re.compile(
            r"^i-\w{8}\s*\(arn:aws:euare::%s:user/%s\)$" %
            (login_user.account_number, login_user.id))

        for address in addresslist:
            if INSTANCE_ID_PTN_MINE_USED.match(address.instance_id):
                #取得済み、インスタンスへ取り付け済み(管理者の場合)
                count += 1

    else:
        # 非管理者の場合は取得件数そのまま
        for address in addresslist:
            if address.instance_id:
                count += 1

    return count
Exemplo n.º 10
0
def snapshot_delete(request):
	"""バックアップ削除ボタン(スナップショット)"""

	#セッションからログインユーザ情報を取得する
	login_user = request.session['ss_usr_user']

	# エラー情報
	errors = []

	logger.info('データボリュームメニュー バックアップ削除 開始')

	#セッション情報
	snapshot = request.session['ss_vol_snapshots_selected']

	#Eucalyptus操作
	try:
		#Eucalyptus基盤へのアクセサを生成する
		get_euca_info=GetEucalyptusInfo(login_user)
		# スナップショット削除
		get_euca_info.delete_snapshot(snapshot_id=snapshot.id)
	except Exception, ex:
		# Eucalyptusエラー
		errors.append(euca_common.get_euca_error_msg('%s' % ex))
		logger.warn(errors)
		return render_to_response('snapshot_list.html',{'errors':errors},context_instance=RequestContext(request))
Exemplo n.º 11
0
def modpublicrange(request):

    logger.info('公開範囲を変更')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']
    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #ログインユーザのイメージの一覧を取得
    images = get_euca_info.get_image()

    #イメージモデルのリストを取得
    image_model_List = createImageModelList(images)

    #セッションに選択中のイメージナンバーの情報を取得する
    selectImageNumber = request.session['ss_img_selectNumber']

    form = ImagePublicRangeForm(
        {'publicrange': image_model_List[selectImageNumber].is_public})

    publicrange_tuple = [('public', '全体に公開 (システムOSイメージとして登録されます)'),
                         ('private', '自分自身のみ (マイOSイメージとして登録されます)')]

    form.fields['publicrange'].choices = publicrange_tuple

    request.session['ss_img_publicrange'] = publicrange_tuple

    return render_to_response('modify_image_range.html', {
        'image_model_List': image_model_List,
        'form': form
    },
                              context_instance=RequestContext(request))
Exemplo n.º 12
0
def createsnapshot(request):
	"""バックアップを作成ボタン(ボリューム)"""

	#セッションからログインユーザ情報を取得する
	login_user = request.session['ss_usr_user']

	# エラー情報
	errors = []

	logger.info('データボリュームメニュー バックアップを作成 開始')

	#入力フォーム
	form = volume_form.VolumeForm(request.POST)
	form.is_valid()

	#セッション情報との一致チェック
	selected = request.session['ss_vol_volumes_selected']
	if selected.db.volume_id != form.cleaned_data['volume_id']:
		errors.append("不正な画面遷移です。表示更新を行ってから再操作してください。")
		logger.warn(errors)
		return render_to_response('volume_list.html',{'form':form,'errors':errors},context_instance=RequestContext(request))

	#Eucalyptus操作
	try:
		#Eucalyptus基盤へのアクセサを生成する
		get_euca_info=GetEucalyptusInfo(login_user)
		# スナップショット作成
		created_snapshot = get_euca_info.create_snapshot(volume_id=selected.db.volume_id)
	except Exception, ex:
		# Eucalyptusエラー
		errors.append(euca_common.get_euca_error_msg('%s' % ex))
		logger.warn(errors)
		return render_to_response('volume_list.html',{'form':form,'errors':errors},context_instance=RequestContext(request))
Exemplo n.º 13
0
def ruledel(request, rule_num):
    """接続ルール削除"""

    logger.info('ファイアウォール 接続ルール削除')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    # エラー情報
    errors = []

    # 入力フォーム
    form = ModifyForm(request.POST)

    # セッション情報
    target = request.session['ss_scr_modify']

    index = int(rule_num)
    if index < len(target.rules):
        del_rule = target.rules[index]
    else:
        errors.append("不正な接続ルールが選択されました。")
        return render_to_response('securitygroup_mod.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))

    #ルール削除(Eucalyptus操作)
    try:
        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)

        #ルール削除
        return_code = get_euca_info.revoke_securitygroup(
            group_name=target.name,
            src_security_group_name=del_rule.from_group,
            src_security_group_owner_id=del_rule.from_user,
            ip_protocol=del_rule.ip_protocol,
            from_port=del_rule.from_port,
            to_port=del_rule.to_port,
            cidr_ip=del_rule.cidr)

        if not return_code:
            errors.append("接続許可ルール削除に失敗しました。")
            return render_to_response('securitygroup_mod.html', {
                'form': form,
                'errors': errors
            },
                                      context_instance=RequestContext(request))

    except Exception, ex:
        # Eucalyptusエラー
        errors.append("接続許可ルール削除に失敗しました。")
        errors.append(euca_common.get_euca_error_msg('%s' % ex))
        return render_to_response('securitygroup_mod.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))
Exemplo n.º 14
0
def create(request):
    """接続鍵を作成ボタン"""

    logger.info('接続鍵 作成')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    #エラー情報
    errors = []

    #入力フォーム
    form = keypair_form.KeypairForm(request.POST)

    # 入力チェック
    if not form.is_valid():
        tmp_errors = form.errors.values()
        for error in tmp_errors:
            errors.extend(error)
        return render_to_response('keypair_list.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))

    try:
        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)
        # キーペアを作成
        keypair = get_euca_info.create_keypair(form.cleaned_data['name'])
    except Exception, ex:
        # Eucalyptusエラー
        errors = [euca_common.get_euca_error_msg('%s' % ex)]
Exemplo n.º 15
0
def getKeypairList(login_user=None):
    """キーペアのリストを取得
		input: login_user:models.User
		return: [["キーペア名", "フィンガープリント", ダウンロード可否]]
	"""
    if login_user == None:
        return []

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)
    # キーペア一覧を取得
    keypairs = get_euca_info.get_keypairs()
    # キーペア一覧を選択リストへ設定
    keypairlist = []
    for keypair in keypairs:
        sub_keypair = []
        sub_keypair.append(keypair.name)  # 鍵名
        sub_keypair.append(keypair.fingerprint)  #フィンガープリント
        #		if keypair.name in db_keypairlist:			#ダウンロード可否
        if models.Keypair.objects.filter(user_id=login_user.id,
                                         account_id=login_user.account_id,
                                         name=keypair.name):
            sub_keypair.append(True)
        else:
            sub_keypair.append(False)
        keypairlist.append(sub_keypair)

    return keypairlist
Exemplo n.º 16
0
def getVolumeList(login_user=None, rootDevice=False):
	"""データボリューム(EBSボリューム)のリストを取得
		input: login_user:models.User
		return: [volume_model.VolumeData]
	"""
	volumeList = []
	if login_user == None:
		return []

	#ボリュームのオブジェクトを取得する
	db_volumeList = models.Volume.objects.select_related(depth=1).filter(user_id=login_user.id).order_by('name')

	#Eucalyptus基盤へのアクセサを生成する
	get_euca_info=GetEucalyptusInfo(login_user)
	#ログインユーザのボリュームの一覧を取得
	volumes = get_euca_info.get_volumelist()

	euca_metadata = EucalyptusMetadataDB()
	image_snapshot_list = euca_metadata.getImageSnapshotList()

	#DB情報とEucalyptusAPI情報を合成する
	for volume in volumes:
		if rootDevice != isRootDevice(volume, image_snapshot_list):
			continue

		volumeData = VolumeData()
		volumeData.size = volume.size						#サイズ
		volumeData.root_device = rootDevice
		if volume.snapshot_id:
			volumeData.snapshot_id = volume.snapshot_id		#スナップショットID
		volumeData.zone = volume.zone						#availabilityZone
		volumeData.status = volume.status					#ステータス
		volumeData.createTime = getDisplayTime(volume.create_time)			#作成日時
		if volume.status == 'in-use':
			volumeData.attached = True						#アタッチフラグ
			volumeData.instance_id = volume.attach_data.instance_id		#アタッチ時:インスタンスID
			volumeData.machine_name = getInstanceNameFromId(volume.attach_data.instance_id)
			volumeData.device = volume.attach_data.device				#アタッチ時:デバイス
			volumeData.attach_status = volume.attach_data.status		#アタッチ時:アタッチ状況
			volumeData.attach_time = getDisplayTime(volume.attach_data.attach_time)		#アタッチ時:アタッチ日時
		for db_volume in db_volumeList:
			if volume.id == db_volume.volume_id:
				volumeData.db = db_volume
				if db_volume.machine:
					volumeData.machine_name = db_volume.machine.name	#仮想マシン名
				break
		else:
			# 内部DBに情報が存在しないEBSの場合
			db_volume = models.Volume()
			db_volume.volume_id = volume.id
			db_volume.name = volume.id
			db_volume.account_id = login_user.account_id
			db_volume.user_id = login_user.id
			volumeData.db = db_volume

		#print pickle.dumps(volumeData)
		volumeList.append(volumeData)

	return volumeList
Exemplo n.º 17
0
def delete(request):

    logger.info('イメージの削除')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #ログインユーザのイメージの一覧を取得
    images = get_euca_info.get_image()

    message = ""
    form = ImageModForm()

    if not 'ss_img_selectNumber' in request.session:
        #イメージモデルのリストを取得
        image_model_List = createImageModelList(images)
        return render_to_response('image_list.html', {
            'image_model_List': image_model_List,
            'form': form,
            'message': message
        },
                                  context_instance=RequestContext(request))

    #イメージモデルのリストを取得
    image_model_List = createImageModelList(images)

    selected_image_model = None

    for image_model in image_model_List:
        if image_model.id == request.session['ss_img_selectID']:
            selected_image_model = image_model
            break

    deregister = DeregisterOSImage(selected_image_model)

    deregister.deregisterImage()

    selected_image_model.delete()

    #選択中のイメージをリストから削除する
    del image_model_List[request.session['ss_img_selectNumber']]

    if 'ss_img_selectNumber' in request.session:
        del request.session['ss_img_selectNumber']
    if 'ss_img_selectID' in request.session:
        del request.session['ss_img_selectID']

    logger.info('イメージの削除完了')

    return render_to_response('image_list.html', {
        'image_model_List': image_model_List,
        'form': form,
        'message': message
    },
                              context_instance=RequestContext(request))
Exemplo n.º 18
0
def create(request):

    #カスタムログ
    logger = logging.getLogger('koalalog')
    logger.info('テンプレート新規作成')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    #テンプレートのデータモデルのリストを作成する
    template_model_List = createTemplateModelList(login_user)

    form = TemplateModForm()

    #ToDo Eucalyptusへの短時間接続エラー無理やり回避策
    time.sleep(1)

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #リスト型をタプル型に変換して値を渡す
    form.fields['image'].choices = getSelectListImage(get_euca_info)
    form.fields['vmtype'].choices = getSelectListVMType(get_euca_info)

    #エラーメッセージなし
    message = ""

    return render_to_response('create_template.html', {
        'template_model_List': template_model_List,
        'form': form,
        'message': message
    },
                              context_instance=RequestContext(request))
Exemplo n.º 19
0
def createform_from_snapshot(request):
	"""作成ボタン(スナップショットボリューム)"""

	#セッションからログインユーザ情報を取得する
	login_user = request.session['ss_usr_user']

	# エラー情報
	errors = []

	logger.info('データボリュームメニュー スナップショットからボリューム作成フォーム作成 開始')

	#入力フォーム用スナップショット一覧
	snapshots = request.session['ss_vol_snapshots']
	snapshotChoice = [ [snapshot.id, snapshot.id] for snapshot in snapshots ]

	# スナップショット画面からの遷移の場合、初期状態でスナップショットID選択
	initialData = {}
	selectedSnapshot = request.session['ss_vol_snapshots_selected']
	if selectedSnapshot:
		initialData['snapshot'] = selectedSnapshot.id

	# 入力フォーム
	form = volume_form.VolumeCreateForm(initial=initialData)
	form.fields['snapshot'].choices = snapshotChoice

	#入力フォーム用Availability Zone一覧
	try:
		#Eucalyptus基盤へのアクセサを生成する
		get_euca_info=GetEucalyptusInfo(login_user)
		# Availability Zone一覧を取得
		zones = get_euca_info.get_availabilityzones()
		# Availability Zone一覧を選択リストへ設定
		zonelist = []
		for zone in zones:
			sub_zone = []
			sub_zone.append(zone.name)
			sub_zone.append(zone.name)
			zonelist.append(sub_zone)
		form.fields['zone'].choices = zonelist
		request.session['ss_vol_avalabilityzonelist'] = zonelist
	except Exception, ex:
		# Eucalyptusエラー
		errors.append("Availability Zone情報の参照に失敗しました。")
		errors.append(euca_common.get_euca_error_msg('%s' % ex))
		logger.warn(errors)
Exemplo n.º 20
0
def detach(request):
	"""取り外しボタン(ボリューム)"""

	#セッションからログインユーザ情報を取得する
	login_user = request.session['ss_usr_user']

	# エラー情報
	errors = []

	logger.info('データボリュームメニュー 仮想マシンから取り外し 開始')

	#入力フォーム
	form = volume_form.VolumeForm(request.POST)
	form.is_valid()

	#セッション情報との一致チェック
	selected = request.session['ss_vol_volumes_selected']
	if selected.db.volume_id != form.cleaned_data['volume_id']:
		errors.append("不正な画面遷移です。表示更新を行ってから再操作してください。")
		logger.warn(errors)
		return render_to_response('volume_list.html',{'form':form,'errors':errors},context_instance=RequestContext(request))

	print selected.instance_id

	# 取り付け先の仮想マシンが起動中の場合
	if selected.instance_id:
		#Eucalyptus操作
		try:
			#Eucalyptus基盤へのアクセサを生成する
			get_euca_info=GetEucalyptusInfo(login_user)
			# EBSボリューム取り外し
			return_code = get_euca_info.detach_volume(volume_id=selected.db.volume_id, instance_id=selected.instance_id,force=True)

			if not return_code:
				errors.append("起動中の仮想マシンからのボリューム取り外しに失敗しました。")
				logger.warn(errors)
				return render_to_response('volume_list.html',{'form':form,'errors':errors},context_instance=RequestContext(request))

			""" TODO:アタッチ状況が"detaching"->"detached"->""(ステータス"available")へ遷移するのを確認する"""

		except Exception, ex:
			# Eucalyptusエラー
			errors.append(euca_common.get_euca_error_msg('%s' % ex))
			logger.warn(errors)
			return render_to_response('volume_list.html',{'form':form,'errors':errors},context_instance=RequestContext(request))
Exemplo n.º 21
0
def mod(request):

    #カスタムログ
    logger = logging.getLogger('koalalog')
    logger.info('テンプレート修正')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    if not 'ss_tpl_selectNumber' in request.session:
        template_model_List = []
        return render_to_response('template_list.html',
                                  {'template_model_List': template_model_List},
                                  context_instance=RequestContext(request))

    #選択中のテンプレートの位置を取得する
    selectTemplateNumber = request.session['ss_tpl_selectNumber']

    logger.debug("template_id=%s " % selectTemplateNumber)

    #テンプレートのデータモデルのリストを作成する
    template_model_List = createTemplateModelList(login_user)

    if len(template_model_List) <= 0:
        return render_to_response('template_list.html',
                                  {'template_model_List': template_model_List},
                                  context_instance=RequestContext(request))

    selectedTemplate = template_model_List[selectTemplateNumber]

    form = TemplateModForm({
        'name': selectedTemplate.name,
        'description': selectedTemplate.description,
        'count': selectedTemplate.count,
        'image': selectedTemplate.image.id,
        'vmtype': selectedTemplate.vmtype.vmtype
    })

    #ToDo Eucalyptusへの短時間接続エラー無理やり回避策
    time.sleep(1)

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #リスト型をタプル型に変換して値を渡す
    form.fields['image'].choices = getSelectListImage(get_euca_info)
    form.fields['vmtype'].choices = getSelectListVMType(get_euca_info)

    #エラーメッセージなし
    message = ""

    return render_to_response('modify_template.html', {
        'template_model_List': template_model_List,
        'form': form,
        'message': message
    },
                              context_instance=RequestContext(request))
Exemplo n.º 22
0
def createTemplateModelList(login_user=None):
    template_model_List = []
    if login_user == None:
        return []

    #テンプレートdbのオブジェクトをすべて取得する
    db_templateList = Template.objects.all()

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #ログインユーザのイメージの一覧を取得
    images = get_euca_info.get_image()
    #リソースの一覧を取得する

    # Apache対応(VMTypesオブジェクトを取得できるよう、DBからユーザ情報を取得)
    #db_user = User.objects.get(account_id=login_user.account_id, user_id=login_user.id)
    #vmtypes = get_euca_info.get_vmtypes(db_user)

    for db_template in db_templateList:

        vmtype_model = euca_common.createVMTypeModel(db_template.vmtype)

        if vmtype_model == None:
            continue

        db_user = User.objects.get(account_id=db_template.account_id,
                                   user_id=db_template.user_id)
        if db_user == None:
            continue

        templete_user = User_Model(db_user)

        image_model = euca_common.createImageModel(images,
                                                   db_template.image_id)

        if image_model == None:
            continue

        template_model = Template_Model(db_template, templete_user,
                                        image_model, vmtype_model)
        template_model_List.append(template_model)

    return template_model_List
Exemplo n.º 23
0
def getSecurityGroupList(login_user=None, groupnames=None):
    """ファイアウォール(セキュリティグループ)のリストを取得
		input: login_user:models.User
		return: [securitygroup_model.Securitygroup_Model]
	"""
    if login_user == None:
        return []

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)
    # ファイヤウォール(セキュリティグループ)一覧を取得
    securitygroups = get_euca_info.get_securitygroups(groupnames=groupnames)
    # ファイヤウォール(セキュリティグループ)一覧を選択リストへ設定
    securitygrouplist = []
    for group in securitygroups:
        # Eucalyptus3.0では管理者も自アカウントのセキュリティグループのみ取得するので、ID一致によるフィルタ不要
        #		if login_user.id == group.owner_id:
        #groupData = Securitygroup_Model(name=group.name, owner_id=group.owner_id, description=group.description)

        owner = getUserFromSecurityGroup(group)
        groupData = Securitygroup_Model(name=group.name,
                                        owner_id=owner.name,
                                        description=group.description)
        for rule in group.rules:
            ruleBase = Rule_Model(ip_protocol=rule.ip_protocol,
                                  from_port=rule.from_port,
                                  to_port=rule.to_port)
            for grant in rule.grants:
                ruleData = copy.deepcopy(ruleBase)
                if grant.owner_id or grant.name:
                    if grant.owner_id:
                        ruleData.from_user = grant.owner_id
                    if grant.name:
                        ruleData.from_group = grant.name
                else:
                    ruleData.cidr = grant.cidr_ip

                groupData.rules.append(ruleData)

        securitygrouplist.append(groupData)

    return securitygrouplist
Exemplo n.º 24
0
def getSnapshotList(login_user=None):
	"""バックアップ(スナップショット)のリストを取得
		input: login_user:models.User
		return: [volume_model.SnapshotData]
	"""
	snapshotList = []
	if login_user == None:
		return []


	#Eucalyptus基盤へのアクセサを生成する
	get_euca_info=GetEucalyptusInfo(login_user)
	#ログインユーザのボリュームの一覧を取得
	snapshots = get_euca_info.get_snapshotlist()

	euca_metadata = EucalyptusMetadataDB()
	image_snapshot_list = euca_metadata.getImageSnapshotList()

	#DB情報とEucalyptusAPI情報を合成する
	for snapshot in snapshots:
# Eucalyptus3.0では管理者でも他ユーザーのリソースを取得しないので、ユーザIDによるフィルタ不要。
# 処理を残したい場合は「if login_user.account_number == snapshot.owner_id:」でアカウント番号との一致チェックにする
#		if login_user.id == snapshot.owner_id:
			snapshotData = SnapshotData()
			snapshotData.id = snapshot.id						#スナップショットID
			snapshotData.volume_id = snapshot.volume_id			#ボリュームID
			snapshotData.start_time = getDisplayTime(snapshot.start_time)		#作成日時
			snapshotData.status = snapshot.status				#ステータス
			snapshotData.progress = snapshot.progress			#進行状況
			snapshotData.owner_id = snapshot.owner_id			#オーナーID
			snapshotData.volume_size = snapshot.volume_size		#作成元ボリュームサイズ(Eucalyptus3.0から有効)

			for snap in image_snapshot_list:
				if snap.snapshot_id == snapshot.id:
					snapshotData.image = snap.image_id
					break

			#print pickle.dumps(snapshotData)
			snapshotList.append(snapshotData)

	return snapshotList
Exemplo n.º 25
0
def getData(request, login_user):

    logger.debug("getData begin")
    tool = GetEucalyptusInfoBy2ool()
    request.session['res_instances'] = tool.getInstanceListVerbose(login_user)
    request.session['res_volumes'] = tool.getVolumeListVerbose(login_user)
    request.session['res_snapshots'] = tool.getSnapshotListVerbose(login_user)
    request.session['res_nodes'] = tool.getNodeList(login_user)
    request.session['res_frontends'] = tool.getServices(login_user)
    request.session['cloud_properties'] = tool.getCloudProperties(login_user)

    eucadb = EucalyptusDB()
    acc_list = eucadb.getAccountList()
    acc_info_list = []
    for acc in acc_list:
        acc_info = Account_information()
        acc_info.accountname = acc.name
        acc_info.accountid = acc.id_number
        acc_info_list.append(acc_info)
    request.session['res_accounts'] = acc_info_list

    boto = GetEucalyptusInfo()
    request.session['res_vmtypes'] = boto.get_vmtypes(login_user.db_user)

    eucaMetaDB = EucalyptusMetadataDB()
    volumeOwner = eucaMetaDB.getVolumeOwnerList()

    relate_frontends(request)
    relate_volume(request, volumeOwner)
    relate_snapshot(request)
    relate_instance(request)
    relate_account(request)
    relate_node(request)
    request.session.modified = True
    request.session['res_last_update'] = datetime.now()
    logger.debug("getData end")
Exemplo n.º 26
0
def delete(request, keyname):
    """削除ボタン"""

    logger.info('接続鍵 削除')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    #エラー情報
    errors = []

    #入力フォーム
    form = keypair_form.KeypairForm(request.POST)

    #Eucalyptus操作
    try:
        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)
        # キーペアを削除
        #keypair = get_euca_info.delete_keypair(keyname)
        get_euca_info.delete_keypair(keyname)
    except Exception, ex:
        # Eucalyptusエラー
        errors = [euca_common.get_euca_error_msg('%s' % ex)]
Exemplo n.º 27
0
def docreate(request):

    #カスタムログ
    logger = logging.getLogger('koalalog')
    logger.info('テンプレート新規作成 作成ボタン押下')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    #テンプレートのデータモデルのリストを作成する
    template_model_List = createTemplateModelList(login_user)

    form = TemplateModForm(request.POST)

    #ToDo Eucalyptusへの短時間接続エラー無理やり回避策
    time.sleep(1)

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #リスト型をタプル型に変換して値を渡す
    form.fields['image'].choices = getSelectListImage(get_euca_info)
    form.fields['vmtype'].choices = getSelectListVMType(get_euca_info)

    #保存ボタンを押下した時の処理
    if form.is_valid():
        logger.info('テンプレート新規作成 作成実施')
        #ToDo Eucalyptusへの短時間接続エラー無理やり回避策
        time.sleep(1)

        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)

        #ログインユーザのイメージの一覧を取得
        images = get_euca_info.get_image()

        selectImage = form.cleaned_data['image']
        selectVMType = form.cleaned_data['vmtype']

        new_image_model = euca_common.createImageModel(images, selectImage)

        # Apache対応(VMTypesオブジェクトを取得できるよう、DBからユーザ情報を取得)
        #db_user = User.objects.get(account_id = login_user.account_id, user_id = login_user.id)
        #vmtypes = get_euca_info.get_vmtypes(db_user)

        new_vmtype_model = euca_common.createVMTypeModel(selectVMType)

        new_db_template = Template()

        new_db_template.name = form.cleaned_data['name']
        new_db_template.description = form.cleaned_data['description']
        new_db_template.count = form.cleaned_data['count']
        new_db_template.account_id = login_user.account_id
        new_db_template.user_id = login_user.id
        new_db_template.image_id = selectImage
        new_db_template.vmtype = selectVMType

        if login_user.admin == True:
            new_db_template.kind = 1
        else:
            new_db_template.kind = 0

        #DBに登録
        new_db_template.save()

        #新規登録したテンプレートのモデルを生成する
        new_template_model = Template_Model(new_db_template, login_user,
                                            new_image_model, new_vmtype_model)

        template_model_List.append(new_template_model)

        #新規作成したテンプレートを選択状態にする

        #セッションに選択中のテンプレートナンバーの情報を保持する
        request.session['ss_tpl_selectNumber'] = len(template_model_List) - 1

        #セッションに選択中のテンプレートナンバーの情報を保持する
        request.session['ss_tpl_selectID'] = new_db_template.id

        logger.info('テンプレート新規作成 完了')

        return render_to_response('template_list.html',
                                  {'template_model_List': template_model_List},
                                  context_instance=RequestContext(request))

    else:
        message = []
        tmp_errors = form.errors.values()
        for error in tmp_errors:
            message.extend(error)
            logger.warn(error)

        return render_to_response('create_template.html', {
            'template_model_List': template_model_List,
            'form': form,
            'message': message
        },
                                  context_instance=RequestContext(request))
Exemplo n.º 28
0
def domod(request):

    #カスタムログ
    logger = logging.getLogger('koalalog')
    logger.info('テンプレート修正 保存ボタン押下')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    #選択中のテンプレートの位置を取得する
    selectTemplateNumber = request.session['ss_tpl_selectNumber']

    logger.debug("template_id=%s " % selectTemplateNumber)

    #テンプレートのデータモデルのリストを作成する
    template_model_List = createTemplateModelList(login_user)

    selectedTemplate = template_model_List[selectTemplateNumber]

    form = TemplateModForm(request.POST)

    #ToDo Eucalyptusへの短時間接続エラー無理やり回避策
    time.sleep(1)

    #Eucalyptus基盤へのアクセサを生成する
    get_euca_info = GetEucalyptusInfo(login_user)

    #リスト型をタプル型に変換して値を渡す
    form.fields['image'].choices = getSelectListImage(get_euca_info)
    form.fields['vmtype'].choices = getSelectListVMType(get_euca_info)

    #保存ボタンを押下した時の処理
    if form.is_valid():
        logger.info('テンプレート修正 保存')
        selectedTemplate.name = form.cleaned_data['name']
        selectedTemplate.description = form.cleaned_data['description']
        selectedTemplate.count = form.cleaned_data['count']

        #ToDo Eucalyptusへの短時間接続エラー無理やり回避策
        time.sleep(1)

        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)

        #ログインユーザのイメージの一覧を取得
        images = get_euca_info.get_image()

        selectImage = form.cleaned_data['image']
        selectVMType = form.cleaned_data['vmtype']

        logger.debug('selectImage = %s ' % selectImage)
        logger.debug('selectVMType = %s' % selectVMType)

        if euca_common.createImageModel(images, selectImage) != None:
            selectedTemplate.image = euca_common.createImageModel(
                images, selectImage)

        # Apache対応(VMTypesオブジェクトを取得できるよう、DBからユーザ情報を取得)
        #db_user = User.objects.get(account_id=login_user.account_id, user_id=login_user.id)
        #vmtypes = get_euca_info.get_vmtypes(db_user)

        if euca_common.createVMTypeModel(selectVMType) != None:
            selectedTemplate.vmtype = euca_common.createVMTypeModel(
                selectVMType)

        logger.info('テンプレート修正 完了')

        return render_to_response('template_list.html',
                                  {'template_model_List': template_model_List},
                                  context_instance=RequestContext(request))

    else:
        #エラーメッセージ
        message = []
        tmp_errors = form.errors.values()
        for error in tmp_errors:
            message.extend(error)
            logger.warn(error)

        return render_to_response('modify_template.html', {
            'template_model_List': template_model_List,
            'form': form,
            'message': message
        },
                                  context_instance=RequestContext(request))
Exemplo n.º 29
0
def ruleadd(request):
    """接続ルール追加"""

    logger.info('ファイアウォール 接続ルール追加')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    # エラー情報
    errors = []

    # 入力フォーム
    form = ModifyForm(request.POST)

    # セッション情報
    target = request.session['ss_scr_modify']

    # 入力チェック
    if not form.is_valid():
        tmp_errors = form.errors.values()
        for error in tmp_errors:
            errors.extend(error)
        return render_to_response('securitygroup_mod.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))

    if form.cleaned_data['addType'] == "address":
        # 外部接続
        if not form.cleaned_data['protocol']:
            errors.append("プロトコルを入力してください。")
        if not form.cleaned_data['portMin'] or not form.cleaned_data['portMax']:
            errors.append("解放ポート範囲を入力してください。")
        elif form.cleaned_data['portMin'] > form.cleaned_data['portMax']:
            errors.append("解放ポート範囲が不正です。")
        if not form.cleaned_data['cidr']:
            errors.append("接続許可アドレス範囲を入力してください。")

    elif form.cleaned_data['addType'] == "group":
        # グループ間接続
        if not form.cleaned_data['fromUser']:
            errors.append("接続許可ユーザーを入力してください。")
        if not form.cleaned_data['fromGroup']:
            errors.append("接続許可ファイアウォールを入力してください。")

    if errors:
        return render_to_response('securitygroup_mod.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))

    #ルール追加(Eucalyptus操作)
    try:
        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)

        #ルール削除
        return_code = get_euca_info.authorize_securitygroup(
            group_name=target.name,
            src_security_group_name=form.cleaned_data['fromGroup'],
            src_security_group_owner_id=form.cleaned_data['fromUser'],
            ip_protocol=form.cleaned_data['protocol'],
            from_port=form.cleaned_data['portMin'],
            to_port=form.cleaned_data['portMax'],
            cidr_ip=form.cleaned_data['cidr'])

        if not return_code:
            errors.append("接続許可ルール追加に失敗しました。")
            return render_to_response('securitygroup_mod.html', {
                'form': form,
                'errors': errors
            },
                                      context_instance=RequestContext(request))

    except Exception, ex:
        # Eucalyptusエラー
        errors.append("接続許可ルール追加に失敗しました。")
        errors.append(euca_common.get_euca_error_msg('%s' % ex))
        return render_to_response('securitygroup_mod.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))
Exemplo n.º 30
0
def create(request):
    """ファイアウォール作成"""

    logger.info('ファイアウォール 作成')

    #セッションからログインユーザ情報を取得する
    login_user = request.session['ss_usr_user']

    # エラー情報
    errors = []

    # 入力フォーム
    form = CreateForm(request.POST)

    # 入力チェック
    if not form.is_valid():
        tmp_errors = form.errors.values()
        for error in tmp_errors:
            errors.extend(error)
        return render_to_response('securitygroup_create.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))

    #セキュリティグループ作成(Eucalyptus操作)
    try:
        #Eucalyptus基盤へのアクセサを生成する
        get_euca_info = GetEucalyptusInfo(login_user)

        #セキュリティグループ作成
        security_group = get_euca_info.create_securitygroup(
            name=form.cleaned_data['name'],
            description=form.cleaned_data['description'])

        if form.cleaned_data['defaultrule']:
            # 初期ルール設定
            # icmp
            return_code = get_euca_info.authorize_securitygroup(
                group_name=form.cleaned_data['name'],
                ip_protocol='icmp',
                from_port=-1,
                to_port=-1,
                cidr_ip='0.0.0.0/0')

            if not return_code:
                errors.append("初期ルールの登録に失敗しました。")

            # ssh
            return_code = get_euca_info.authorize_securitygroup(
                group_name=form.cleaned_data['name'],
                ip_protocol='tcp',
                from_port=22,
                to_port=22,
                cidr_ip='0.0.0.0/0')

            if not return_code:
                errors.append("初期ルールの登録に失敗しました。")

    except Exception, ex:
        # Eucalyptusエラー
        errors.append("ファイアウォール作成に失敗しました。")
        errors.append(euca_common.get_euca_error_msg('%s' % ex))
        return render_to_response('securitygroup_create.html', {
            'form': form,
            'errors': errors
        },
                                  context_instance=RequestContext(request))