Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions front/assets/js/common/api/services/csproles_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,3 +190,46 @@ export async function getCspProviders() {
return response.data.responseData;
}

// ===== 동기화 API Functions =====

// CSP Role 동기화
export async function syncCspRoles(provider = null) {
const controller = "/api/mc-iam-manager/SyncCspRoles";
const data = {
Request: {
provider: provider
}
};
const response = await mockAPIPost(controller, data);
return response.data.responseData;
}

// 정책 동기화
export async function syncPolicies(roleId = null) {
const controller = "/api/mc-iam-manager/SyncPolicies";
const data = {
Request: {
roleId: roleId
}
};
const response = await mockAPIPost(controller, data);
return response.data.responseData;
}

// CSP Policy 업데이트
export async function updateCspPolicy(policyId, policyData) {
const controller = "/api/mc-iam-manager/UpdateCspPolicy";
const data = {
pathParams: {
policyId: policyId.toString()
},
Request: {
name: policyData.name,
description: policyData.description,
document: policyData.document
}
};
const response = await mockAPIPost(controller, data);
return response.data.responseData;
}

108 changes: 108 additions & 0 deletions front/assets/js/common/api/services/csproles_mock_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,15 @@ export function handleMockAPIRequest(controller, data = null) {
case "/api/mc-iam-manager/GetCspProviders":
result = handleGetCspProviders();
break;
case "/api/mc-iam-manager/SyncCspRoles":
result = handleSyncCspRoles(data);
break;
case "/api/mc-iam-manager/SyncPolicies":
result = handleSyncPolicies(data);
break;
case "/api/mc-iam-manager/UpdateCspPolicy":
result = handleUpdateCspPolicy(data);
break;
default:
result = { error: "Unknown controller" };
}
Expand Down Expand Up @@ -558,6 +567,105 @@ function handleGetCspProviders() {
}));
}

// CSP Role 동기화
function handleSyncCspRoles(data) {
const request = data?.Request || {};
const provider = request.provider;

// 동기화 시뮬레이션 - 실제로는 외부 CSP에서 최신 역할 목록을 가져옴
const syncRoles = generateMockCspRoles();

if (provider) {
const filteredRoles = syncRoles.filter(role => role.provider === provider);
// 기존 역할과 병합 (중복 제거)
const existingRoleIds = mockData.roles.map(r => r.id);
const newRoles = filteredRoles.filter(role => !existingRoleIds.includes(role.id));
mockData.roles.push(...newRoles);

return {
success: true,
message: `Synced ${newRoles.length} new roles for ${provider}`,
syncedRoles: newRoles.length,
totalRoles: mockData.roles.filter(r => r.provider === provider).length
};
} else {
// 모든 Provider 동기화
const existingRoleIds = mockData.roles.map(r => r.id);
const newRoles = syncRoles.filter(role => !existingRoleIds.includes(role.id));
mockData.roles.push(...newRoles);

return {
success: true,
message: `Synced ${newRoles.length} new roles across all providers`,
syncedRoles: newRoles.length,
totalRoles: mockData.roles.length
};
}
}

// 정책 동기화
function handleSyncPolicies(data) {
const request = data?.Request || {};
const roleId = request.roleId;

// 동기화 시뮬레이션 - 실제로는 외부 CSP에서 최신 정책 목록을 가져옴
const syncPolicies = generateMockCspPolicies();

if (roleId) {
// 특정 역할의 정책 동기화
const role = mockData.roles.find(r => r.id === roleId);
if (!role) {
throw new Error(`CSP Role with ID ${roleId} not found`);
}

const rolePolicies = syncPolicies.filter(policy => policy.provider === role.provider);
const existingPolicyIds = mockData.policies.map(p => p.id);
const newPolicies = rolePolicies.filter(policy => !existingPolicyIds.includes(policy.id));
mockData.policies.push(...newPolicies);

return {
success: true,
message: `Synced ${newPolicies.length} new policies for role ${roleId}`,
syncedPolicies: newPolicies.length,
roleId: roleId
};
} else {
// 모든 정책 동기화
const existingPolicyIds = mockData.policies.map(p => p.id);
const newPolicies = syncPolicies.filter(policy => !existingPolicyIds.includes(policy.id));
mockData.policies.push(...newPolicies);

return {
success: true,
message: `Synced ${newPolicies.length} new policies`,
syncedPolicies: newPolicies.length,
totalPolicies: mockData.policies.length
};
}
}

// CSP Policy 업데이트
function handleUpdateCspPolicy(data) {
const policyId = data?.pathParams?.policyId;
const request = data?.Request || {};

const policyIndex = mockData.policies.findIndex(p => p.id === policyId);
if (policyIndex === -1) {
throw new Error(`CSP Policy with ID ${policyId} not found`);
}

const updatedPolicy = {
...mockData.policies[policyIndex],
name: request.name || mockData.policies[policyIndex].name,
description: request.description || mockData.policies[policyIndex].description,
document: request.document || mockData.policies[policyIndex].document,
last_modified: new Date().toISOString()
};

mockData.policies[policyIndex] = updatedPolicy;
return { success: true, policy: updatedPolicy };
}

// ===== Utility Functions =====

// 목데이터 초기화 (테스트용)
Expand Down
6 changes: 3 additions & 3 deletions front/assets/js/common/api/services/mci_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,8 @@ export async function searchImage(nsId, searchParams) {
request: {
includeDeprecatedImage: searchParams.includeDeprecatedImage || false,
isGPUImage: searchParams.isGPUImage || false,
isKubernetesImage: searchParams.isKubernetesImage || false,
isRegisteredByAsset: searchParams.isRegisteredByAsset || false,
// isKubernetesImage: searchParams.isKubernetesImage || false,
// isRegisteredByAsset: searchParams.isRegisteredByAsset || false,
osArchitecture: searchParams.osArchitecture || "x86_64",
osType: searchParams.osType || "ubuntu 22.04",
providerName: searchParams.providerName || "",
Expand Down Expand Up @@ -764,7 +764,7 @@ export async function createPolicy(nsId, mciId, policy) {
alert("Project has not set")
return;
}

console.log("policy", policy)
let data = {
pathParams: {
nsId: nsId,
Expand Down
2 changes: 1 addition & 1 deletion front/assets/js/common/api/services/remotecmd_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ async function processCommand(nsid, resourceId, targetId, command, term, callbac
const stdout = response.stdout;
const stderr = response.stderr;

if (callErr) {
if (callErr && Object.keys(callErr).length > 0) {
const formattedError = JSON.stringify(callErr, null, 2);
writeAutoWrap(term, " > connect Error: \x1b[1m\x1b[31m" + formattedError + "\x1b[0m");
callback({ error: callErr });
Expand Down
102 changes: 79 additions & 23 deletions front/assets/js/pages/operation/manage/mci.js
Original file line number Diff line number Diff line change
Expand Up @@ -515,13 +515,23 @@ export function handleCheck(type, id) {
if (div.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(div);
}
// Server Info도 닫기
const serverInfoDiv = document.getElementById("subGroup_vm_info");
if (serverInfoDiv && serverInfoDiv.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(serverInfoDiv);
}
} else {
// 다른 항목 선택 - 기존 선택 해제 후 새 항목 선택
if (selectedVmGroupId && selectedVmGroupId !== id) {
$(`#checkbox_vmGroup_${selectedVmGroupId}`).prop("checked", false);
}
selectedVmGroupId = id;
currentSubGroupId = id;
// Server Info 닫기 (다른 항목 선택 시)
const serverInfoDiv = document.getElementById("subGroup_vm_info");
if (serverInfoDiv && serverInfoDiv.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(serverInfoDiv);
}
vmListInSubGroup(currentSubGroupId);
}
} else {
Expand All @@ -533,19 +543,47 @@ export function handleCheck(type, id) {
if (div.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(div);
}
// Server Info도 닫기
const serverInfoDiv = document.getElementById("subGroup_vm_info");
if (serverInfoDiv && serverInfoDiv.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(serverInfoDiv);
}
}
} else if (type === 'subgroup_vm') {
if (checkbox.prop("checked")) {
// 기존 선택된 SubGroup VM이 있다면 해제
if (selectedSubGroupVmId && selectedSubGroupVmId !== id) {
$(`#checkbox_subgroup_vm_${selectedSubGroupVmId}`).prop("checked", false);
// 같은 항목 재선택인지 확인
if (selectedSubGroupVmId === id) {
// 같은 항목 재선택 - 토글 닫기
selectedSubGroupVmId = null;
currentSubGroupVmId = null;
clearServerInfo();
const div = document.getElementById("subGroup_vm_info");
if (div && div.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(div);
}
} else {
// 다른 항목 선택 - 기존 선택 해제 후 새 항목 선택
if (selectedSubGroupVmId && selectedSubGroupVmId !== id) {
$(`#checkbox_subgroup_vm_${selectedSubGroupVmId}`).prop("checked", false);
}
selectedSubGroupVmId = id;
currentSubGroupVmId = id;
webconsolejs['pages/operation/manage/mci'].subGroup_vmDetailInfo(currentSubGroupVmId);
// Server Info 토글 (c 버튼 역할)
const div = document.getElementById("subGroup_vm_info");
if (div && !div.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(div);
}
}
selectedSubGroupVmId = id;
currentSubGroupVmId = id;
webconsolejs['pages/operation/manage/mci'].subGroup_vmDetailInfo(currentSubGroupVmId);
} else {
selectedSubGroupVmId = null;
currentSubGroupVmId = null;
clearServerInfo();
// 체크 해제 시 토글 닫기
const div = document.getElementById("subGroup_vm_info");
if (div && div.classList.contains("active")) {
webconsolejs["partials/layout/navigatePages"].toggleElement(div);
}
}
}
// 마지막 선택된 VM 강조 표시
Expand Down Expand Up @@ -873,13 +911,12 @@ export async function vmDetailInfo(vmId) {

export async function subGroup_vmDetailInfo(vmId) {
currentSubGroupVmId = vmId
// Toggle MCIS Info
var div = document.getElementById("subGroup_vm_info");

const hasActiveClass = div.classList.contains("active");
if (!hasActiveClass) {
webconsolejs["partials/layout/navigatePages"].toggleElement(div)
}
// Server Info는 c 버튼으로만 제어되므로 자동 토글 제거
// var div = document.getElementById("subGroup_vm_info");
// const hasActiveClass = div.classList.contains("active");
// if (!hasActiveClass) {
// webconsolejs["partials/layout/navigatePages"].toggleElement(div)
// }

// get mci vm
try {
Expand Down Expand Up @@ -940,6 +977,7 @@ export async function subGroup_vmDetailInfo(vmId) {
var vmDescription = data.description;
var vmPublicIp = data.publicIP == undefined ? "" : data.publicIP;
var vmSshKeyID = data.sshKeyId;
var cspVMID = data.uid;

try {
var imageId = data.imageId
Expand Down Expand Up @@ -970,6 +1008,9 @@ export async function subGroup_vmDetailInfo(vmId) {
$("#subgroup_mci_server_info_connection").empty()
$("#subgroup_mci_server_info_connection").append(vmProviderIcon)

// CSP 정보 설정
$("#subgroup_server_info_csp").text(providerName)


$("#subgroup_server_info_text").text(' [ ' + currentSubGroupId + ' / ' + vmName + ' ]')
$("#subgroup_server_info_name").text(vmName + "/" + vmId)
Expand Down Expand Up @@ -1098,6 +1139,21 @@ function clearServerInfo() {
$("#server_info_public_ip").text("")
$("#server_info_private_ip").text("")

// subgroup 필드들 초기화
$("#subgroup_server_info_csp").text("")
$("#subgroup_server_info_region").text("")
$("#subgroup_server_info_zone").text("")
$("#subgroup_server_info_connection_name").text("")
$("#subgroup_server_info_cspVMID").text("")
$("#subgroup_server_info_vmspec_name").text("")
$("#subgroup_server_info_archi").text("")
$("#subgroup_server_info_public_ip").text("")
$("#subgroup_server_info_private_ip").text("")
$("#subgroup_server_info_os").text("")
$("#subgroup_server_info_start_time").text("")
$("#subgroup_server_info_public_dns").text("")
$("#subgroup_server_info_private_dns").text("")

// ip information
$("#server_detail_info_public_ip_text").text("")
$("#server_info_public_dns").val("")
Expand Down Expand Up @@ -2306,13 +2362,13 @@ export async function deletePolicy() {
await loadPolicyData();

// 현재 선택된 MCI가 있으면 해당 MCI를 다시 선택 (Policy 탭에서 이미 선택된 상태 유지)
if (currentMciId && mciListTable) {
if (window.currentMciId && mciListTable) {
try {
const row = mciListTable.getRow(currentMciId);
const row = mciListTable.getRow(window.currentMciId);
if (row) {
// MCI 선택 상태 유지
var tempcurmciID = row.getCell("id").getValue();
currentMciId = tempcurmciID;
window.currentMciId = tempcurmciID;

// mci_info 요소가 이미 활성화되어 있는지 확인하고 필요시 활성화
const mciInfoElement = document.getElementById("mci_info");
Expand Down Expand Up @@ -2438,7 +2494,7 @@ export async function deployPolicy() {
// API 호출
const response = await webconsolejs["common/api/services/mci_api"].createPolicy(
window.currentNsId,
currentMciId,
window.currentMciId,
requestData.policy
);

Expand All @@ -2462,13 +2518,13 @@ export async function deployPolicy() {
}

// 현재 선택된 MCI가 있으면 해당 MCI를 다시 선택
if (currentMciId && mciListTable) {
if (window.currentMciId && mciListTable) {
try {
const row = mciListTable.getRow(currentMciId);
const row = mciListTable.getRow(window.currentMciId);
if (row) {
// 강제로 MCI 선택 상태로 만들기
var tempcurmciID = row.getCell("id").getValue();
currentMciId = tempcurmciID;
window.currentMciId = tempcurmciID;

// mci_info 요소를 직접 활성화
const mciInfoElement = document.getElementById("mci_info");
Expand Down Expand Up @@ -2597,9 +2653,9 @@ function buildPolicyRequestData(data) {
command: data.command ? [data.command] : [],
userName: data.userName
},
vmDynamicReq: {
commonImage: data.commonImage,
commonSpec: data.commonSpec,
subGroupDynamicReq: {
imageId: data.commonImage,
specId: data.commonSpec,
connectionName: data.connectionName,
description: data.description,
label: {
Expand Down
Loading
Loading