Skip to content

Commit

Permalink
change sync-mode logic with hpa support (#98)
Browse files Browse the repository at this point in the history
  • Loading branch information
FreakyGranny authored and dekhtyarev committed Jun 3, 2019
1 parent a79876e commit 2a12ade
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 45 deletions.
57 changes: 31 additions & 26 deletions k8s_handle/k8s/mocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,26 @@ def read_namespaced_deployment(self, name, namespace):
if self.name == '404' or name == '404':
raise ApiException(reason='Not Found')

my_response = namedtuple('my_response', 'metadata status')
my_response = namedtuple('my_response', 'metadata status spec')
my_status = namedtuple('my_status',
'replicas available_replicas ready_replicas updated_replicas unavailable_replicas')

my_spec = namedtuple('my_spec', 'replicas')
if self.name == 'test1':
return my_response(metadata={}, status=my_status(replicas=3,
available_replicas=2,
ready_replicas=1,
updated_replicas=None,
unavailable_replicas=1))
return my_response(metadata={}, spec=my_spec(replicas=3),
status=my_status(replicas=3,
available_replicas=2,
ready_replicas=1,
updated_replicas=None,
unavailable_replicas=1))
if self.name == 'test2' or name == 'test2':
return my_response(metadata={}, status=my_status(replicas=1,
available_replicas=1,
ready_replicas=1,
updated_replicas=1,
unavailable_replicas=None))
return my_response(metadata={}, spec=my_spec(replicas=1),
status=my_status(replicas=1,
available_replicas=1,
ready_replicas=1,
updated_replicas=1,
unavailable_replicas=None))

return my_response(metadata={'key1': 'value1'}, status={'key1': 'value1'})
return my_response(metadata={'key1': 'value1'}, status={'key1': 'value1'}, spec={'key1': 'value1'})

def create_namespaced_deployment(self, body, namespace):
if self.name == 'fail':
Expand Down Expand Up @@ -113,25 +115,28 @@ def read_namespaced_stateful_set(self, name, namespace):
if self.name == '404':
raise ApiException(reason='Not Found')

my_response = namedtuple('my_response', 'metadata status')
my_response = namedtuple('my_response', 'metadata status spec')
my_status = namedtuple('my_status',
'current_replicas current_revision ready_replicas replicas update_revision')
my_spec = namedtuple('my_spec', 'replicas')

if self.name == 'test1':
return my_response(metadata={}, status=my_status(current_replicas=2,
current_revision='revision-123',
ready_replicas=1,
replicas=3,
update_revision='revision-321'))
return my_response(metadata={}, spec=my_spec(replicas=3),
status=my_status(current_replicas=2,
current_revision='revision-123',
ready_replicas=1,
replicas=3,
update_revision='revision-321'))

if self.name == 'test2':
return my_response(metadata={}, status=my_status(current_replicas=3,
current_revision='revision-123',
ready_replicas=3,
replicas=3,
update_revision='revision-123'))

return my_response(metadata={'key1': 'value1'}, status={'key1': 'value1'})
return my_response(metadata={}, spec=my_spec(replicas=3),
status=my_status(current_replicas=3,
current_revision='revision-123',
ready_replicas=3,
replicas=3,
update_revision='revision-123'))

return my_response(metadata={'key1': 'value1'}, status={'key1': 'value1'}, spec={'key1': 'value1'})

# DaemonSet
def read_namespaced_daemon_set(self, name, namespace):
Expand Down
20 changes: 11 additions & 9 deletions k8s_handle/k8s/provisioner.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ def __init__(self, command, sync_mode, show_logs):
self.show_logs = show_logs

@staticmethod
def _replicas_count_are_greater_or_equal(replicas):
def _replicas_count_are_equal(replicas):
replicas = [0 if r is None else r for r in replicas] # replace all None to 0
return all(r >= replicas[0] for r in replicas)
return all(r == replicas[0] for r in replicas)

@staticmethod
def _ports_are_equal(old_port, new_port):
Expand Down Expand Up @@ -326,14 +326,15 @@ def _get_pod_name_and_containers_by_selector(kube_client, selector, tries, timeo
def _wait_deployment_complete(self, kube_client, tries, timeout):
for i in range(0, tries):
sleep(timeout)
status = kube_client.get().status
deployment = kube_client.get()
status = deployment.status

replicas = [kube_client.replicas, status.replicas, status.available_replicas,
replicas = [deployment.spec.replicas, status.replicas, status.available_replicas,
status.ready_replicas, status.updated_replicas]

log.info('desiredReplicas = {}, updatedReplicas = {}, availableReplicas = {}'.
format(replicas[0], replicas[4], replicas[2]))
if self._replicas_count_are_greater_or_equal(replicas) and status.unavailable_replicas is None:
if self._replicas_count_are_equal(replicas) and status.unavailable_replicas is None:
log.info('Deployment completed on {} attempt'.format(i + 1))
return
else:
Expand All @@ -344,17 +345,18 @@ def _wait_deployment_complete(self, kube_client, tries, timeout):
def _wait_statefulset_complete(self, kube_client, tries, timeout):
for i in range(0, tries):
sleep(timeout)
status = kube_client.get().status
statefulset = kube_client.get()
status = statefulset.status

current_revision = status.current_revision
update_revision = status.update_revision
replicas = [kube_client.replicas, status.current_replicas, status.ready_replicas]
replicas = [statefulset.spec.replicas, status.current_replicas, status.ready_replicas]

log.info('Current revision {}, should be {}'.format(current_revision, update_revision))
if current_revision == update_revision:
log.info('desiredReplicas = {}, updatedReplicas = {}, availableReplicas = {}'.
format(replicas[0], replicas[1], replicas[2]))
if self._replicas_count_are_greater_or_equal(replicas):
if self._replicas_count_are_equal(replicas):
log.info('StatefulSet completed on {} attempt'.format(i))
return
else:
Expand All @@ -371,7 +373,7 @@ def _wait_daemonset_complete(self, kube_client, tries, timeout):
status.number_ready, status.updated_number_scheduled]
log.info('desiredNodes = {}, availableNodes = {}, readyNodes = {}, updatedNodes = {}'.
format(replicas[0], replicas[1], replicas[2], replicas[3]))
if self._replicas_count_are_greater_or_equal(replicas) and status.number_unavailable is None:
if self._replicas_count_are_equal(replicas) and status.number_unavailable is None:
log.info('DaemonSet completed on {} attempt'.format(i))
return
else:
Expand Down
12 changes: 2 additions & 10 deletions k8s_handle/k8s/test_provisioner.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,16 +375,8 @@ def test_get_template_contexts(self):
class TestKubeObject(unittest.TestCase):
def test_replicas_equal(self):
replicas = (1, 1, 1)
self.assertTrue(Provisioner._replicas_count_are_greater_or_equal(replicas))

def test_replicas_greater(self):
replicas = (2, 3, 3)
self.assertTrue(Provisioner._replicas_count_are_greater_or_equal(replicas))
self.assertTrue(Provisioner._replicas_count_are_equal(replicas))

def test_replicas_not_equal(self):
replicas = (1, 1, 0)
self.assertFalse(Provisioner._replicas_count_are_greater_or_equal(replicas))

def test_replicas_with_hpa_not_equal(self):
replicas = (6, 7, 5)
self.assertFalse(Provisioner._replicas_count_are_greater_or_equal(replicas))
self.assertFalse(Provisioner._replicas_count_are_equal(replicas))

0 comments on commit 2a12ade

Please sign in to comment.