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))
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
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)
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)
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
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))
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))
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))
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
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))
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))
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))
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))
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)]
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
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
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))
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))
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)
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))
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))
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
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
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
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")
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)]
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))
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))
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))
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))