diff --git a/README.md b/README.md index b92a8f0..d42d469 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# Hypershift ton OpenStack CLI Assistant +# Hypershift CLI Assistant Click [here](https://shiftstack.github.io/hcp-cli-assistant/) to open the assistant. -An interactive web UI wizard that helps users generate the correct `hcp create cluster openstack` command for deploying **HyperShift on OpenStack**. +An interactive web UI wizard that helps users generate the correct `hcp create cluster` commands. The assistant guides users step-by-step through required and optional configurations, ensuring a smooth setup experience. -![UI screenshot](screenshot.png?raw=true "UI screenshot") +![UI demo](demo.gif?raw=true "UI demo") ## Features - Step-by-step wizard for easy input @@ -46,4 +46,4 @@ This project is open-source and available under the **Apache 2.0 License**. --- -Developed for HyperShift on OpenStack users. +Developed for HyperShift users. diff --git a/demo.gif b/demo.gif new file mode 100644 index 0000000..e0a9a1a Binary files /dev/null and b/demo.gif differ diff --git a/index.html b/index.html index 92345d5..466cde5 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ - HyperShift on OpenStack - CLI assistant + HyperShift CLI assistant
diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index 0973bd8..0000000 Binary files a/screenshot.png and /dev/null differ diff --git a/src/App.jsx b/src/App.jsx index ffcea5d..4ac47a4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -165,8 +165,8 @@ export default function HcpCliAssistant() { // Platform config const platforms = useMemo(() => [ { value: "openstack", label: "OpenStack" }, + { value: "aws", label: "AWS" }, // Future platforms can be added here - // { value: "aws", label: "AWS" }, // { value: "azure", label: "Azure" }, ], []); @@ -178,6 +178,12 @@ export default function HcpCliAssistant() { "OpenStack Node Configuration", "Review & Generate Command" ], + aws: [ + "AWS Node Configuration", + "AWS Storage Configuration", + "AWS Network Configuration", + "Review & Generate Command" + ], // Add more platform steps as they become available }), []); @@ -205,6 +211,16 @@ export default function HcpCliAssistant() { nodeImageName: "", dnsNameservers: "", additionalPorts: "[]", // Initialize as string to avoid JSON parsing issues + + // AWS specific fields + awsInstanceType: "", + awsInstanceProfile: "", + awsSubnetId: "", + awsSecurityGroupId: "", + awsRootVolumeSize: "120", + awsRootVolumeType: "gp3", + awsRootVolumeIops: "", + awsRootVolumeKmsKey: "", }); // Get steps based on selected platform - memoize to prevent recalculation @@ -333,6 +349,17 @@ export default function HcpCliAssistant() { } } + if (form.platform === "aws") { + const platformStep = step - 2; // Adjust for common steps + + switch (platformStep) { + case 0: // AWS Node Configuration + return form.awsInstanceType.trim() !== "" && form.awsInstanceProfile.trim() !== ""; + default: + return true; + } + } + return false; }, [step, form, platformSteps, parsePorts]); @@ -414,6 +441,55 @@ export default function HcpCliAssistant() { return cmd; } + if (form.platform === "aws") { + let cmd = `hcp create cluster aws \ + --name ${form.name} \ + --base-domain ${form.baseDomain} \ + --node-pool-replicas ${form.nodePoolReplicas} \ + --pull-secret ${form.pullSecret} \ + --ssh-key ${form.sshKey} \ + --instance-type ${form.awsInstanceType}`; + + // Add optional AWS parameters + if (form.awsInstanceType) { + cmd += ` \ + --instance-type ${form.awsInstanceType}`; + } + + if (form.awsInstanceProfile) { + cmd += ` \ + --instance-profile ${form.awsInstanceProfile}`; + } + + if (form.awsSubnetId) { + cmd += ` \ + --subnet-id ${form.awsSubnetId}`; + } + + if (form.awsRootVolumeSize && form.awsRootVolumeSize !== "120") { + cmd += ` \ + --root-volume-size ${form.awsRootVolumeSize}`; + } + + if (form.awsRootVolumeType && form.awsRootVolumeType !== "gp3") { + cmd += ` \ + --root-volume-type ${form.awsRootVolumeType}`; + } + + if (form.awsRootVolumeIops) { + cmd += ` \ + --root-volume-iops ${form.awsRootVolumeIops}`; + } + + if (form.awsRootVolumeKmsKey) { + cmd += ` \ + --root-volume-kms-key ${form.awsRootVolumeKmsKey}`; + } + + cmd = cmd.replace(/\s+/g, ' ').trim(); + return cmd; + } + return "Platform command generation not implemented"; }, [form, parsePorts]); @@ -657,6 +733,86 @@ export default function HcpCliAssistant() { ); + const renderAwsNodeConfigStep = () => ( + <> + + + + + ); + + const renderAwsStorageConfigStep = () => ( + <> + + + + + + + + + ); + + const renderAwsNetworkConfigStep = () => ( + <> + + + + + ); + // Render current step content const renderStepContent = () => { if (step === 0) { @@ -678,6 +834,21 @@ export default function HcpCliAssistant() { ); } + } else if (form.platform === "aws") { + const platformStep = step - 2; // Adjust for common steps + + switch (platformStep) { + case 0: return renderAwsNodeConfigStep(); + case 1: return renderAwsStorageConfigStep(); + case 2: return renderAwsNetworkConfigStep(); + case 3: return renderCommandReviewStep(); + default: + return ( +
+

Unknown step for the AWS platform. Please go back and try again.

+
+ ); + } } else if (form.platform) { // For any platform that is selected but not implemented return (