Skip to content
Draft
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ build/
__pycache__/
textual.log
.ropeproject/
vendor/
5 changes: 4 additions & 1 deletion Dockerfile.assisted-swarm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM quay.io/centos/centos:stream8
FROM quay.io/centos/centos:stream10

ARG WORK_DIR=/data

Expand All @@ -8,4 +8,7 @@ RUN chmod ug+x /usr/local/bin/dry-installer
COPY ./build/assisted-swarm /assisted-swarm
ENV GODEBUG=madvdontneed=1
ENV GOGC=50

RUN dnf install nmap util-linux -y

CMD ["/assisted-swarm"]
2 changes: 1 addition & 1 deletion Dockerfile.assisted-swarm-build
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM registry.ci.openshift.org/openshift/release:golang-1.17
FROM registry.ci.openshift.org/openshift/release:golang-1.22
ENV GO111MODULE=on
ENV GOFLAGS=""

Expand Down
16 changes: 6 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
ASSISTED_SWARM = build/assisted-swarm
CONTAINER_COMMAND := $(or $(CONTAINER_COMMAND),docker)
IMAGE := $(or $(IMAGE),quay.io/oamizur/assisted-swarm:latest)
ifeq ($(CONTAINER_COMMAND), docker)
CONTAINER_COMMAND = $(shell docker -v | cut -f1 -d' ' | tr '[:upper:]' '[:lower:]')
endif
IMAGE := $(or $(IMAGE),quay.io/otuchfel/assisted-swarm:latest)

.PHONY: build-image generate clean
.PHONY: $(ASSISTED_SWARM) build-image generate clean

build-image: $(ASSISTED_SWARM)
$(CONTAINER_COMMAND) build -f Dockerfile.assisted-swarm . -t $(IMAGE)
podman build -f Dockerfile.assisted-swarm . -t $(IMAGE)

generate:
CONTAINER_COMMAND="$(CONTAINER_COMMAND)" ./hack/generate.sh generate_from_swagger
./hack/generate.sh generate_from_swagger

$(ASSISTED_SWARM):
CGO_ENABLED=1 go build -o $(ASSISTED_SWARM) cmd/main.go

push:
$(CONTAINER_COMMAND) push $(IMAGE)
podman push $(IMAGE)

clean:
/bin/rm -f $(ASSISTED_SWARM)
$(CONTAINER_COMMAND) image rm $(IMAGE)
podman image rm $(IMAGE)
49 changes: 43 additions & 6 deletions agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import tempfile
import waiting
from pathlib import Path
from typing import List
from typing import List, Any

from collections import OrderedDict
from dataclasses import dataclass
Expand Down Expand Up @@ -36,6 +36,8 @@ class SwarmAgentConfig:
token: str
ssh_pub_key: str
pull_secret: str
pull_secret_token: str
service_mode: str
service_url: str
shared_storage: Path
executor: SwarmExecutor
Expand All @@ -45,6 +47,7 @@ class SwarmAgentConfig:
kube_cache: SwarmKubeCache
num_locks: int
swarm_client: SwarmApi
ocm_token: str


@dataclass
Expand All @@ -61,6 +64,7 @@ class ClusterAgentConfig:
machine_hostname: str
machine_ip: str
cluster_identifier: str
infraenv_id: str
cluster_dir: Path
cluster_hosts: List[dict]
agent_dir: Path
Expand All @@ -84,6 +88,7 @@ def __init__(
{
"Initializing": self.initialize,
"Waiting for ISO URL on InfraEnv": self.wait_iso_url_infraenv,
"Waiting for ISO URL on InfraEnv": self.wait_iso_url_infraenv_saas,
'Seting BMH provisioning state to "ready"': self.ready_bmh,
"Waiting for ISO URL on BMH": self.wait_iso_url_bmh,
"Download ISO": self.download_iso,
Expand Down Expand Up @@ -135,7 +140,7 @@ def initialize(self, next_state):

def download_iso(self, next_state):
self.swarm_agent_config.executor.check_call(
["curl", "--insecure", "--silent", "--show-error", "--output", "/dev/null", self.bmh_iso_url]
["curl", "--insecure", "--silent", "--show-error", "--output", "/dev/null", self.infraenv_iso_url]
)

return next_state
Expand All @@ -150,7 +155,29 @@ def get_infraenv_id_from_url(url):

raise RuntimeError("Could not find infraenv ID from url")

def wait_iso_url_infraenv_saas(self, next_state):
infraenv = requests.get(
f"{self.swarm_agent_config.service_url}/api/assisted-install/v2/infra-envs/{self.cluster_agent_config.infraenv_id}",
headers={"Authorization": f"Bearer {self.swarm_agent_config.ocm_token}"},
)

infraenv.raise_for_status()

iso_url = infraenv.json().get("download_url", "")
if iso_url == "":
self.logging.info("Infraenv download_url is empty")
return self.state

self.logging.info(f"Infraenv download_url found {iso_url}")
self.infraenv_iso_url = iso_url
self.infraenv_id = self.cluster_agent_config.infraenv_id

return next_state

def wait_iso_url_infraenv(self, next_state):
if self.swarm_agent_config.service_mode != "k8s":
return next_state

infraenv = self.swarm_agent_config.kube_cache.get_infraenv(
namespace=self.cluster_agent_config.cluster_identifier, name=self.cluster_agent_config.cluster_identifier
)
Expand All @@ -176,6 +203,9 @@ def wait_iso_url_infraenv(self, next_state):
return self.state

def wait_iso_url_bmh(self, next_state):
if self.swarm_agent_config.service_mode != "k8s":
return next_state

baremetalhost = self.swarm_agent_config.kube_cache.get_baremetalhost(
namespace=self.cluster_agent_config.cluster_identifier, name=self.identifier
)
Expand Down Expand Up @@ -229,20 +259,26 @@ def set_bmh_provisioning_state(self, provisioning_state):
return False

def ready_bmh(self, next_state):
if self.swarm_agent_config.service_mode != "k8s":
return next_state

if self.set_bmh_provisioning_state("ready"):
return next_state

return self.state

def provisioned_bmh(self, next_state):
if self.swarm_agent_config.service_mode != "k8s":
return next_state

if self.set_bmh_provisioning_state("provisioned"):
return next_state

return self.state

def wait_for_completion(self, id):
def has_agent_completed():
response = self.swarm_agent_config.swarm_client.get_agent(id)
response: Any = self.swarm_agent_config.swarm_client.get_agent(id)
return response.status == AgentStatus.TERMINATED
try:
waiting.wait(has_agent_completed,
Expand All @@ -264,10 +300,11 @@ def run_agent(self, next_state):
service_url=self.service_url,
infra_env_id=self.infraenv_id,
agent_version=self.swarm_agent_config.agent_image_path,
cacert=str(self.swarm_agent_config.ca_cert_path),
# cacert=str(self.swarm_agent_config.ca_cert_path),
cacert="/tmp/dummy",
containers_conf=str(self.container_config),
containers_storage_conf=str(self.container_storage_conf),
pull_secret=self.swarm_agent_config.pull_secret,
pull_secret=self.swarm_agent_config.pull_secret_token,
dry_forced_host_id=self.host_id,
dry_forced_mac_address=self.cluster_agent_config.mac_address,
dry_fake_reboot_marker_path=str(self.fake_reboot_marker_path),
Expand All @@ -277,7 +314,7 @@ def run_agent(self, next_state):
dry_forced_host_ipv4=self.cluster_agent_config.machine_ip,
)

response = self.swarm_agent_config.swarm_client.create_new_agent(new_agent_params=new_agent_params)
response: Any = self.swarm_agent_config.swarm_client.create_new_agent(new_agent_params=new_agent_params)
try:
return next_state if self.wait_for_completion(response.id) else self.state
finally:
Expand Down
Loading