Skip to content

Commit

Permalink
Fix/20200226 (#162)
Browse files Browse the repository at this point in the history
* fix: update initClusterVersion

* feat: add project namespace resourceLimit display

* fix: fix alarm(project) useless api
  • Loading branch information
KayIter committed Mar 2, 2020
1 parent d8da656 commit 0754831
Show file tree
Hide file tree
Showing 46 changed files with 786 additions and 523 deletions.
3 changes: 2 additions & 1 deletion web/console/config/resource/common/dataFormat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ export const dataFormatConfig = {
lbcfBGPort: 'lbcfBGPort',
backendGroups: 'backendGroups',
backendRecords: 'backendRecords',
forceDeletePod: 'forceDeletePod'
forceDeletePod: 'forceDeletePod',
resourceLimit: 'resourceLimit'
};
21 changes: 21 additions & 0 deletions web/console/config/resource/k8sConfig/namespace.project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ const displayField: DisplayField = {
isLink: true, // 用于判断该值是否为链接
isClip: true
},
clusterName: {
dataField: ['spec.clusterId'],
dataFormat: dataFormatConfig['text'],
width: '20%',
headTitle: t('归属集群'),
noExsitedValue: defaulNotExistedValue
},
status: {
dataField: ['status.phase'],
dataFormat: dataFormatConfig['status'],
Expand All @@ -26,6 +33,20 @@ const displayField: DisplayField = {
headTitle: t('创建时间'),
noExsitedValue: defaulNotExistedValue
},
hard: {
dataField: ['spec.hard'],
dataFormat: dataFormatConfig['resourceLimit'],
width: '25%',
headTitle: t('资源限制'),
noExsitedValue: defaulNotExistedValue
},
used: {
dataField: ['status.used'],
dataFormat: dataFormatConfig['resourceLimit'],
width: '25%',
headTitle: t('已使用'),
noExsitedValue: defaulNotExistedValue
},
operator: {
dataField: [''],
dataFormat: dataFormatConfig['operator'],
Expand Down
7 changes: 4 additions & 3 deletions web/console/config/resourceConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,15 @@ export const ResourceConfigVersionMap = (k8sVersion: string) => {
};

const getResourceConfig = (resourceFunc: (k8sVersion: string) => ResourceInfo, k8sVersion: string) => {
return resourceFunc(k8sVersion);
let result = resourceFunc(k8sVersion);
return Object.assign({}, result, { k8sVersion });
};

/** ResourceConfig的返回定义 */
export type ResourceConfigKey = { [key in keyof ApiVersion]: ResourceInfo };

export const resourceConfig = (k8sVersion: string = '1.8'): ResourceConfigKey => {
let finalK8sVersion = ResourceConfigVersionMap(k8sVersion) || '1.8';
export const resourceConfig = (k8sVersion: string = '1.16'): ResourceConfigKey => {
let finalK8sVersion = ResourceConfigVersionMap(k8sVersion) || '1.16';

return {
deployment: getResourceConfig(deployment, finalK8sVersion),
Expand Down
93 changes: 93 additions & 0 deletions web/console/helpers/k8sUnitUtil.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
export enum K8SUNIT {
m = 'm',
unit = 'unit',
K = 'k',
M = 'M',
G = 'G',
T = 'T',
P = 'P',
Ki = 'Ki',
Mi = 'Mi',
Gi = 'Gi',
Ti = 'Ti',
Pi = 'Pi'
}

export function valueLabels1000(value, targetUnit) {
return transformField(
value,
1000,
3,
[K8SUNIT.unit, K8SUNIT.K, K8SUNIT.M, K8SUNIT.G, K8SUNIT.T, K8SUNIT.P],
targetUnit
);
}

export function valueLabels1024(value, targetUnit) {
return transformField(
value,
1024,
3,
[K8SUNIT.unit, K8SUNIT.Ki, K8SUNIT.Mi, K8SUNIT.Gi, K8SUNIT.Ti, K8SUNIT.Pi],
targetUnit
);
}

const UNITS = [K8SUNIT.unit, K8SUNIT.Ki, K8SUNIT.Mi, K8SUNIT.Gi, K8SUNIT.Ti, K8SUNIT.Pi];

/**
* 进行单位换算
* 实现k8s数值各单位之间的相互转换
* @param {string} value
* @param {number} thousands
* @param {number} toFixed
*/
export function transformField(_value: string, thousands, toFixed = 3, units = UNITS, targetUnit: K8SUNIT) {
let reg = /^(\d+(\.\d{1,2})?)([A-Za-z]+)?$/;
let value;
let unitBase;
if (reg.test(_value)) {
[value, unitBase] = [+RegExp.$1, RegExp.$3];
if (unitBase === '') {
unitBase = K8SUNIT.unit;
}
} else {
return '0';
}

let i = units.indexOf(unitBase),
targetI = units.indexOf(targetUnit);
if (thousands) {
if (targetI >= i) {
while (i < targetI) {
value /= thousands;
++i;
}
} else {
while (targetI < i) {
value *= thousands;
++targetI;
}
}
}
let svalue;
if (value > 1) {
svalue = value.toFixed(toFixed);
svalue = svalue.replace(/0+$/, '');
svalue = svalue.replace(/\.$/, '');
} else if (value) {
// 如果数值很小,保留toFixed位有效数字
let tens = 0;
let v = Math.abs(value);
while (v < 1) {
v *= 10;
++tens;
}
svalue = value.toFixed(tens + toFixed - 1);
svalue = svalue.replace(/0+$/, '');
svalue = svalue.replace(/\.$/, '');
} else {
svalue = value;
}
return String(svalue);
}
9 changes: 9 additions & 0 deletions web/console/helpers/urlUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,15 @@ interface K8sRestfulPathOptions {
export const reduceK8sRestfulPath = (options: K8sRestfulPathOptions) => {
let { resourceInfo, namespace = '', specificName = '', extraResource = '', clusterId = '', meshId } = options;

/// #if project
//业务侧ns eg: cls-xxx-ns 需要去除前缀
if (namespace) {
namespace = namespace
.split('-')
.splice(2)
.join('-');
}
/// #endif
let url: string = '';
let isAddon = resourceInfo.requestType && resourceInfo.requestType.addon ? resourceInfo.requestType.addon : false;

Expand Down
2 changes: 1 addition & 1 deletion web/console/src/modules/addon/reducers/RootReducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const RootReducer = combineReducers({

cluster: createListReducer(FFReduxActionName.CLUSTER),

clusterVersion: reduceToPayload(ActionType.ClusterVersion, '1.8'),
clusterVersion: reduceToPayload(ActionType.ClusterVersion, '1.16'),

openAddon: createListReducer(FFReduxActionName.OPENADDON),

Expand Down
114 changes: 38 additions & 76 deletions web/console/src/modules/alarmPolicy/WebAPI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ export async function fetchAlarmPolicy(query: QueryState<AlarmPolicyFilter>) {
let temp = {
id: item.AlarmPolicyId || item.AlarmPolicySettings.AlarmPolicyName,
alarmPolicyId: item.AlarmPolicyId || item.AlarmPolicySettings.AlarmPolicyName,
clusterId: item.ClusterInstanceId,
clusterId: query.filter.clusterId,
alarmPolicyName: item.AlarmPolicySettings.AlarmPolicyName,
alarmPolicyDescription: item.AlarmPolicySettings.AlarmPolicyDescription,
alarmPolicyType: item.AlarmPolicySettings.AlarmPolicyType,
Expand Down Expand Up @@ -215,7 +215,15 @@ function getAlarmPolicyParams(alarmPolicyEdition: AlarmPolicyEdition[], opreator
}
};
if (alarmPolicyEdition[0].alarmObjectsType === 'part') {
/// #if project
//业务侧的namespace需要做前缀处理
alarmPolicyEdition[0].alarmObjectNamespace = alarmPolicyEdition[0].alarmObjectNamespace
.split('-')
.splice(2)
.join('-');
/// #endif
params['Namespace'] = alarmPolicyEdition[0].alarmObjectNamespace;

params['WorkloadType'] = workloadTypeMap[alarmPolicyEdition[0].alarmObjectWorkloadType];
}
alarmPolicyEdition[0].alarmMetrics.forEach(item => {
Expand All @@ -232,7 +240,6 @@ function getAlarmPolicyParams(alarmPolicyEdition: AlarmPolicyEdition[], opreator
},
ContinuePeriod: item.continuePeriod,
Unit: item.unit
// MetricType: item.metricType
};
if (item.metricName === 'k8s_pod_mem_no_cache_bytes' || item.metricName === 'k8s_pod_mem_usage_bytes') {
metrics.Unit = 'B';
Expand Down Expand Up @@ -394,80 +401,6 @@ export async function fetchNamespaceList(query: QueryState<NamespaceFilter>, nam
return result;
}

/**
* Resource列表的查询
* @param query: Resource 的查询过滤条件
* @param resourceInfo:ResourceInfo 资源的相关配置
* @param isClearData: 是否清空数据
* @param k8sQueryObj: any 是否有queryString
*/
export async function fetchResourceList(query: QueryState<ResourceFilter>, resourceInfo: ResourceInfo) {
let { filter } = query,
{ namespace, clusterId, regionId } = filter;

let resourceList = [];

let k8sUrl =
`/${resourceInfo.basicEntry}/` +
(resourceInfo.group ? resourceInfo.group + '/' : '') +
`${resourceInfo.version}/` +
(resourceInfo.namespaces ? `${resourceInfo.namespaces}/${namespace}/` : '') +
`${resourceInfo.requestType['list']}`;

let url = k8sUrl;

// 构建参数
let params: RequestParams = {
method: Method.get,
url,
apiParams: {
module: 'tke',
interfaceName: 'ForwardRequest',
regionId: regionId || 1,
restParams: {
Method: Method.get,
Path: url,
Version: '2018-05-25'
},
opts: {
tipErr: false
}
}
};

try {
let response = await reduceNetworkRequest(params, clusterId);

if (response.code === 0) {
let listItems = JSON.parse(response.data.ResponseBody);
if (listItems.items) {
resourceList = listItems.items.map(item => {
return Object.assign({}, item, { id: uuid() });
});
} else {
// 这里是拉取某个具体的resource的时候,没有items属性
resourceList.push({
metadata: listItems.metadata,
spec: listItems.spec,
status: listItems.status
});
}
}
} catch (error) {
// 这里是搜索的时候,如果搜索不到的话,会报404的错误,只有在 resourceNotFound的时候,不把错误抛出去
if (error.code !== 'ResourceNotFound') {
throw error;
}
}

const result: RecordSet<Resource> = {
recordCount: resourceList.length,
records: resourceList
};

return result;
}

/**
* 获取资源的具体的 yaml文件
* @param resourceIns: Resource[] 当前需要请求的具体资源数据
Expand Down Expand Up @@ -523,3 +456,32 @@ export async function fetchProjectNamespaceList(query: QueryState<ResourceFilter

return result;
}

export async function fetchPrometheuses() {
let resourceInfo: ResourceInfo = resourceConfig().prometheus;
let url = reduceK8sRestfulPath({
resourceInfo
});
let params: RequestParams = {
method: Method.get,
url
};
let records = [];
try {
let response = await reduceNetworkRequest(params);
if (response.code === 0) {
records = response.data.items.map(item => {
return Object.assign({}, item, { id: uuid() });
});
}
} catch (error) {
// 这里是搜索的时候,如果搜索不到的话,会报404的错误,只有在 resourceNotFound的时候,不把错误抛出去
if (error.code !== 'ResourceNotFound') {
throw error;
}
}
return {
records,
recordCount: records.length
};
}
34 changes: 16 additions & 18 deletions web/console/src/modules/alarmPolicy/actions/alarmPolicyActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@ const _alarmPolicyActions = createListAction<AlarmPolicy, AlarmPolicyFilter>({

//业务侧中过滤只有这个namepace下的AlarmPolicy
/// #if project
let { namespaceSelection, route } = getstate();
let namespace = (getstate().namespaceSelection || route.queries['np'])
.split('-')
.splice(2)
.join('-');
response.records = response.records.filter(
item =>
item.alarmObjetcsType === 'part' &&
item.alarmObjectNamespace === getstate().namespaceSelection &&
item.alarmPolicyType === 'pod'
item.alarmObjetcsType === 'part' && item.alarmObjectNamespace === namespace && item.alarmPolicyType === 'pod'
);
response.recordCount = response.records.length;
/// #endif
Expand Down Expand Up @@ -68,10 +71,7 @@ const editActions = {
payload: alarmpolicy.alarmPolicyType
});

// dispatch(groupActions.selectGroup(alarmpolicy.receiverGroups));
dispatch(alarmPolicyActions.initAlarmMetricsForUpdate(alarmpolicy.alarmMetrics, alarmpolicy.alarmPolicyType));
// dispatch(alarmPolicyActions.inputAlarmShieldTimeStart(alarmpolicy.shieldTimeStart || null));
// dispatch(alarmPolicyActions.inputAlarmShieldTimeEnd(alarmpolicy.shieldTimeEnd));
dispatch(
alarmPolicyActions.inputAlarmNotifyWays(
alarmpolicy.notifyWays.map(w => ({
Expand All @@ -81,17 +81,6 @@ const editActions = {
}))
)
);
// dispatch({
// type: ActionType.InputAlarmNotifyWay,
// payload: alarmpolicy.notifyWay
// });
// //当告警渠道有电话时初始化
// if (alarmpolicy.notifyWay.indexOf('CALL') !== -1) {
// dispatch(alarmPolicyActions.inputAlarmPhoneCircleInterval(alarmpolicy.phoneCircleInterval));
// dispatch(alarmPolicyActions.inputAlarmPhoneArriveNotice(alarmpolicy.phoneNotifyOrder));
// dispatch(alarmPolicyActions.inputAlarmPhoneCircleTimes(alarmpolicy.phoneCircleTimes));
// dispatch(alarmPolicyActions.inputAlarmPhoneInnerInterval(alarmpolicy.phoneInnerInterval));
// }
};
},

Expand All @@ -108,10 +97,19 @@ const editActions = {
dispatch(alarmPolicyActions.inputAlarmPolicyObjectsType(alarmpolicy.alarmObjetcsType));
//告警对象是workload且选择按工作负载选择初始化
if (alarmpolicy.alarmObjetcsType === 'part') {
let namespace;
/// #if project
//业务侧的namespace需要做前缀处理
namespace = `${alarmpolicy.clusterId}-${alarmpolicy.alarmObjectNamespace}`;
/// #endif
/// #if tke
namespace = alarmpolicy.alarmObjectNamespace;
/// #endif
dispatch({
type: ActionType.InputAlarmWorkLoadNameSpace,
payload: alarmpolicy.alarmObjectNamespace
payload: namespace
});

dispatch(alarmPolicyActions.inputAlarmObjectWorkloadType(alarmpolicy.alarmObjectWorkloadType));
dispatch(alarmPolicyActions.inputAlarmPolicyObjects(alarmpolicy.alarmObjetcs));
}
Expand Down
Loading

0 comments on commit 0754831

Please sign in to comment.