Skip to content

Commit 9d6ee7f

Browse files
adfostbexsoftAdam Stafforddvaldivia
authored
Changing error for too few nodes (#899)
* changing error * change variable name Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com> Co-authored-by: Adam Stafford <adamstafford@Adams-MacBook-Pro.local> Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
1 parent aa16e75 commit 9d6ee7f

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

operatorapi/error.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ var (
3838
errLicenseNotFound = errors.New("license not found")
3939
errAvoidSelfAccountDelete = errors.New("logged in user cannot be deleted by itself")
4040
errAccessDenied = errors.New("access denied")
41+
errTooFewNodes = errors.New("at least 4 nodes are required in cluster")
42+
errTooFewSchedulableNodes = errors.New("at least 4 schedulable nodes are required in cluster")
43+
errFewerThanFourNodes = errors.New("at least 4 nodes are required in request")
4144
)
4245

4346
// prepareError receives an error object and parse it against k8sErrors, returns the right error code paired with a generic error message
@@ -156,6 +159,18 @@ func prepareError(err ...error) *models.Error {
156159
if errors.Is(err[0], errRemoteTierExists) {
157160
errorMessage = err[0].Error()
158161
}
162+
if errors.Is(err[0], errTooFewNodes) {
163+
errorCode = 507
164+
errorMessage = errTooFewNodes.Error()
165+
}
166+
if errors.Is(err[0], errTooFewSchedulableNodes) {
167+
errorCode = 507
168+
errorMessage = errTooFewSchedulableNodes.Error()
169+
}
170+
if errors.Is(err[0], errFewerThanFourNodes) {
171+
errorCode = 507
172+
errorMessage = errFewerThanFourNodes.Error()
173+
}
159174
}
160175
return &models.Error{Code: errorCode, Message: swag.String(errorMessage), DetailedMessage: swag.String(err[0].Error())}
161176
}

operatorapi/operator_nodes.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,27 @@ func registerNodesHandlers(api *operations.OperatorAPI) {
5656

5757
// getMaxAllocatableMemory get max allocatable memory given a desired number of nodes
5858
func getMaxAllocatableMemory(ctx context.Context, clientset v1.CoreV1Interface, numNodes int32) (*models.MaxAllocatableMemResponse, error) {
59-
if numNodes == 0 {
60-
return nil, errors.New("error NumNodes must be greated than 0")
59+
if numNodes < 4 {
60+
return nil, errors.New("error NumNodes must be at least 4")
6161
}
6262

6363
// get all nodes from cluster
6464
nodes, err := clientset.Nodes().List(ctx, metav1.ListOptions{})
6565
if err != nil {
6666
return nil, err
6767
}
68+
if len(nodes.Items) < int(numNodes) {
69+
return nil, errTooFewNodes
70+
}
71+
activeNodes := 0
72+
for i := 0; i < len(nodes.Items); i++ {
73+
if !nodes.Items[i].Spec.Unschedulable {
74+
activeNodes++
75+
}
76+
}
77+
if activeNodes < int(numNodes) {
78+
return nil, errTooFewSchedulableNodes
79+
}
6880

6981
availableMemSizes := []int64{}
7082
OUTER:

portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantSize.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ const TenantSize = ({
100100
selectedStorageClass,
101101
}: ITenantSizeProps) => {
102102
const [validationErrors, setValidationErrors] = useState<any>({});
103+
const [errorFlag, setErrorFlag] = useState<boolean>(false);
104+
const [nodeError, setNodeError] = useState<string>("");
103105
const usableInformation = ecParityCalc.storageFactors.find(
104106
(element) => element.erasureCode === ecParity
105107
);
@@ -131,7 +133,6 @@ const TenantSize = ({
131133
clusterSizeFactor
132134
);
133135
const memoSize = setMemoryResource(memSize, clusterSizeBytes, maxMemSize);
134-
135136
updateField("memorySize", memoSize);
136137
}, [maxAllocableMemo, memoryNode, sizeFactor, updateField, volumeSize]);
137138

@@ -146,8 +147,9 @@ const TenantSize = ({
146147
const maxMemory = res.max_memory ? res.max_memory : 0;
147148
updateField("maxAllocableMemo", maxMemory);
148149
})
149-
.catch((err: ErrorResponseHandler) => {
150-
updateField("maxAllocableMemo", 0);
150+
.catch((err: any) => {
151+
setErrorFlag(true);
152+
setNodeError(err.errorMessage);
151153
console.error(err);
152154
});
153155
}
@@ -227,7 +229,6 @@ const TenantSize = ({
227229

228230
useEffect(() => {
229231
const parsedSize = getBytes(volumeSize, sizeFactor, true);
230-
231232
const commonValidation = commonFormValidation([
232233
{
233234
fieldKey: "nodes",
@@ -236,6 +237,13 @@ const TenantSize = ({
236237
customValidation: parseInt(nodes) < 4,
237238
customValidationMessage: "Number of nodes cannot be less than 4",
238239
},
240+
{
241+
fieldKey: "nodes",
242+
required: true,
243+
value: nodes,
244+
customValidation: errorFlag,
245+
customValidationMessage: nodeError,
246+
},
239247
{
240248
fieldKey: "volume_size",
241249
required: true,
@@ -288,6 +296,8 @@ const TenantSize = ({
288296
limitSize,
289297
selectedStorageClass,
290298
isPageValid,
299+
errorFlag,
300+
nodeError
291301
]);
292302

293303
/* End Validation of pages */

0 commit comments

Comments
 (0)