timdaman/check_docker

View on GitHub
check_docker/check_docker.py

Summary

Maintainability
A
35 mins
Test Coverage
A
97%

File check_docker.py has 697 lines of code (exceeds 250 allowed). Consider refactoring.
Invalid

#!/usr/bin/env python3
# logging.basicConfig(level=logging.DEBUG)
import argparse
import json
import logging
Severity: Major
Found in check_docker/check_docker.py - About 1 day to fix

    Cyclomatic complexity is too high in function perform_checks. (17)
    Open

    def perform_checks(raw_args):
        args = process_args(raw_args)
    
        global parallel_executor
        parallel_executor = futures.ThreadPoolExecutor(max_workers=args.threads)
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function perform_checks has a Cognitive Complexity of 22 (exceeds 5 allowed). Consider refactoring.
    Invalid

    def perform_checks(raw_args):
        args = process_args(raw_args)
    
        global parallel_executor
        parallel_executor = futures.ThreadPoolExecutor(max_workers=args.threads)
    Severity: Minor
    Found in check_docker/check_docker.py - About 3 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Cyclomatic complexity is too high in function check_version. (11)
    Wontfix

    @singlethread_execution()
    def check_version(container, insecure_registries):
        image_id = get_container_image_id(container)
        logger.debug("Local container image ID: {}".format(image_id))
        if image_id is None:
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in function evaluate_numeric_thresholds. (10)
    Open

    def evaluate_numeric_thresholds(container, value, thresholds, name, short_name,
                                    min=None, max=None, greater_than=True):
        rounder = lambda x: round(x, 2)
    
        INTEGER_UNITS = ['B', '%', '']
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in function calculate_cpu_capacity_precentage. (8)
    Open

    def calculate_cpu_capacity_precentage(info, stats):
        host_config = info['HostConfig']
    
        if 'online_cpus' in stats['cpu_stats']:
            num_cpus = stats['cpu_stats']['online_cpus']
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in function get_containers. (8)
    Wontfix

    def get_containers(names, require_present):
        containers_list, _ = get_url(daemon + '/containers/json?all=1')
    
        all_container_names = set(get_ps_name(x['Names']) for x in containers_list)
    
    
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function evaluate_numeric_thresholds has a Cognitive Complexity of 16 (exceeds 5 allowed). Consider refactoring.
    Wontfix

    def evaluate_numeric_thresholds(container, value, thresholds, name, short_name,
                                    min=None, max=None, greater_than=True):
        rounder = lambda x: round(x, 2)
    
        INTEGER_UNITS = ['B', '%', '']
    Severity: Minor
    Found in check_docker/check_docker.py - About 2 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Cyclomatic complexity is too high in function print_results. (7)
    Wontfix

    def print_results():
        if no_ok:
            # Remove all the "OK"s
            filtered_messages = [message for message in messages if not message.startswith('OK: ')]
            if len(filtered_messages) == 0:
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in function parse_thresholds. (6)
    Wontfix

    def parse_thresholds(spec, include_units=True, units_required=True):
        """
        Given a spec string break it up into ':' separated chunks. Convert strings to ints as it makes sense
    
        :param spec: The threshold specification being parsed
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in function normalize_state. (6)
    Wontfix

    def normalize_state(status_info):
        # Ugh, docker used to report state in as silly way then they figured out how to do it better.
        # This tries the simpler new way and if that doesn't work fails back to the old way
    
        # On new docker engines the status holds whatever the current state is, running, stopped, paused, etc.
    Severity: Minor
    Found in check_docker/check_docker.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function process_args has 32 lines of code (exceeds 25 allowed). Consider refactoring.
    Invalid

    def process_args(args):
        parser = argparse.ArgumentParser(description='Check docker containers.')
    
        # Connect to local socket or ip address
        connection_group = parser.add_mutually_exclusive_group()
    Severity: Minor
    Found in check_docker/check_docker.py - About 1 hr to fix

      Function check_version has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.
      Wontfix

      def check_version(container, insecure_registries):
          image_id = get_container_image_id(container)
          logger.debug("Local container image ID: {}".format(image_id))
          if image_id is None:
              unknown('Checksum missing for "{}", try doing a pull'.format(container))
      Severity: Minor
      Found in check_docker/check_docker.py - About 1 hr to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      Function evaluate_numeric_thresholds has 8 arguments (exceeds 4 allowed). Consider refactoring.
      Wontfix

      def evaluate_numeric_thresholds(container, value, thresholds, name, short_name,
      Severity: Major
      Found in check_docker/check_docker.py - About 1 hr to fix

        Function get_containers has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.
        Wontfix

        def get_containers(names, require_present):
            containers_list, _ = get_url(daemon + '/containers/json?all=1')
        
            all_container_names = set(get_ps_name(x['Names']) for x in containers_list)
        
        
        Severity: Minor
        Found in check_docker/check_docker.py - About 55 mins to fix

        Cognitive Complexity

        Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

        A method's cognitive complexity is based on a few simple rules:

        • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
        • Code is considered more complex for each "break in the linear flow of the code"
        • Code is considered more complex when "flow breaking structures are nested"

        Further reading

        Function calculate_cpu_capacity_precentage has a Cognitive Complexity of 9 (exceeds 5 allowed). Consider refactoring.
        Wontfix

        def calculate_cpu_capacity_precentage(info, stats):
            host_config = info['HostConfig']
        
            if 'online_cpus' in stats['cpu_stats']:
                num_cpus = stats['cpu_stats']['online_cpus']
        Severity: Minor
        Found in check_docker/check_docker.py - About 55 mins to fix

        Cognitive Complexity

        Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

        A method's cognitive complexity is based on a few simple rules:

        • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
        • Code is considered more complex for each "break in the linear flow of the code"
        • Code is considered more complex when "flow breaking structures are nested"

        Further reading

        Function print_results has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
        Wontfix

        def print_results():
            if no_ok:
                # Remove all the "OK"s
                filtered_messages = [message for message in messages if not message.startswith('OK: ')]
                if len(filtered_messages) == 0:
        Severity: Minor
        Found in check_docker/check_docker.py - About 45 mins to fix

        Cognitive Complexity

        Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

        A method's cognitive complexity is based on a few simple rules:

        • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
        • Code is considered more complex for each "break in the linear flow of the code"
        • Code is considered more complex when "flow breaking structures are nested"

        Further reading

        Function check_health has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
        Open

        def check_health(container):
            state = get_state(container)
            if "Health" in state and "Status" in state["Health"]:
                health = state["Health"]["Status"]
                message = "{} is {}".format(container, health)
        Severity: Minor
        Found in check_docker/check_docker.py - About 35 mins to fix

        Cognitive Complexity

        Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

        A method's cognitive complexity is based on a few simple rules:

        • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
        • Code is considered more complex for each "break in the linear flow of the code"
        • Code is considered more complex when "flow breaking structures are nested"

        Further reading

        Avoid too many return statements within this function.
        Invalid

                    return
        Severity: Major
        Found in check_docker/check_docker.py - About 30 mins to fix

          Avoid too many return statements within this function.
          Invalid

                  return
          Severity: Major
          Found in check_docker/check_docker.py - About 30 mins to fix

            Avoid too many return statements within this function.
            Invalid

                    return
            Severity: Major
            Found in check_docker/check_docker.py - About 30 mins to fix

              Function process_args has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
              Wontfix

              def process_args(args):
                  parser = argparse.ArgumentParser(description='Check docker containers.')
              
                  # Connect to local socket or ip address
                  connection_group = parser.add_mutually_exclusive_group()
              Severity: Minor
              Found in check_docker/check_docker.py - About 25 mins to fix

              Cognitive Complexity

              Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

              A method's cognitive complexity is based on a few simple rules:

              • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
              • Code is considered more complex for each "break in the linear flow of the code"
              • Code is considered more complex when "flow breaking structures are nested"

              Further reading

              Function parse_thresholds has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
              Wontfix

              def parse_thresholds(spec, include_units=True, units_required=True):
                  """
                  Given a spec string break it up into ':' separated chunks. Convert strings to ints as it makes sense
              
                  :param spec: The threshold specification being parsed
              Severity: Minor
              Found in check_docker/check_docker.py - About 25 mins to fix

              Cognitive Complexity

              Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

              A method's cognitive complexity is based on a few simple rules:

              • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
              • Code is considered more complex for each "break in the linear flow of the code"
              • Code is considered more complex when "flow breaking structures are nested"

              Further reading

              Refactor this function to reduce its Cognitive Complexity from 23 to the 15 allowed.
              Open

              def perform_checks(raw_args):
              Severity: Critical
              Found in check_docker/check_docker.py by sonar-python

              Cognitive Complexity is a measure of how hard the control flow of a function is to understand. Functions with high Cognitive Complexity will be difficult to maintain.

              See

              Function "evaluate_numeric_thresholds" has 8 parameters, which is greater than the 7 authorized.
              Invalid

              def evaluate_numeric_thresholds(container, value, thresholds, name, short_name,
                                              min=None, max=None, greater_than=True):
              Severity: Major
              Found in check_docker/check_docker.py by sonar-python

              A long parameter list can indicate that a new structure should be created to wrap the numerous parameters or that the function is doing too many things.

              Noncompliant Code Example

              With a maximum number of 4 parameters:

              def do_something(param1, param2, param3, param4, param5):
                  ...
              

              Compliant Solution

              def do_something(param1, param2, param3, param4):
                  ...
              

              Refactor this function to reduce its Cognitive Complexity from 16 to the 15 allowed.
              Open

              def evaluate_numeric_thresholds(container, value, thresholds, name, short_name,
              Severity: Critical
              Found in check_docker/check_docker.py by sonar-python

              Cognitive Complexity is a measure of how hard the control flow of a function is to understand. Functions with high Cognitive Complexity will be difficult to maintain.

              See

              Identical blocks of code found in 2 locations. Consider refactoring.
              Invalid

              class SocketFileHandler(AbstractHTTPHandler):
                  class SocketFileToHttpConnectionAdaptor(HTTPConnection): # pragma: no cover
                      def __init__(self, socket_file, timeout=DEFAULT_TIMEOUT):
                          super().__init__(host='', port=0, timeout=timeout)
                          self.socket_file = socket_file
              Severity: Major
              Found in check_docker/check_docker.py and 1 other location - About 1 day to fix
              check_docker/check_swarm.py on lines 56..71

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 154.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Identical blocks of code found in 2 locations. Consider refactoring.
              Invalid

                  if parsed_args.secure_connection:
                      daemon = 'https://' + parsed_args.secure_connection
                      connection_type = 'https'
                  elif parsed_args.connection:
                      if parsed_args.connection[0] == '/':
              Severity: Major
              Found in check_docker/check_docker.py and 1 other location - About 5 hrs to fix
              check_docker/check_swarm.py on lines 304..313

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 92.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Identical blocks of code found in 2 locations. Consider refactoring.
              Invalid

              def socketfile_permissions_failure(parsed_args):
                  if connection_type == 'socket':
                      return not (os.path.exists(parsed_args.connection)
                                  and stat.S_ISSOCK(os.stat(parsed_args.connection).st_mode)
                                  and os.access(parsed_args.connection, os.R_OK)
              Severity: Major
              Found in check_docker/check_docker.py and 1 other location - About 4 hrs to fix
              check_docker/check_swarm.py on lines 318..325

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 82.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Similar blocks of code found in 2 locations. Consider refactoring.
              Wontfix

              def multithread_execution(disable_threading=DISABLE_THREADING):
                  def inner_decorator(func):
                      def wrapper(container, *args, **kwargs):
                          if DISABLE_THREADING:
                              func(container, *args, **kwargs)
              Severity: Major
              Found in check_docker/check_docker.py and 1 other location - About 3 hrs to fix
              check_docker/check_docker.py on lines 437..447

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 62.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Similar blocks of code found in 2 locations. Consider refactoring.
              Wontfix

              def singlethread_execution(disable_threading=DISABLE_THREADING):
                  def inner_decorator(func):
                      def wrapper(container, *args, **kwargs):
                          if DISABLE_THREADING:
                              func(container, *args, **kwargs)
              Severity: Major
              Found in check_docker/check_docker.py and 1 other location - About 3 hrs to fix
              check_docker/check_docker.py on lines 424..434

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 62.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Similar blocks of code found in 2 locations. Consider refactoring.
              Invalid

                      for candidate in all_container_names:
                          if re.match("^{}$".format(matcher), candidate):
                              filtered.add(candidate)
                              found = True
              Severity: Minor
              Found in check_docker/check_docker.py and 1 other location - About 55 mins to fix
              check_docker/check_swarm.py on lines 133..136

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 37.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Similar blocks of code found in 4 locations. Consider refactoring.
              Invalid

              def get_stats(container):
                  content, _ = get_url(daemon + '/containers/{container}/stats?stream=0'.format(container=container))
                  return content
              Severity: Major
              Found in check_docker/check_docker.py and 3 other locations - About 45 mins to fix
              check_docker/check_docker.py on lines 291..293
              check_docker/check_docker.py on lines 296..298
              check_docker/check_swarm.py on lines 107..109

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 35.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Similar blocks of code found in 4 locations. Consider refactoring.
              Invalid

              def get_image_info(name):
                  content, _ = get_url(daemon + '/images/{image}/json'.format(image=name))
                  return content
              Severity: Major
              Found in check_docker/check_docker.py and 3 other locations - About 45 mins to fix
              check_docker/check_docker.py on lines 291..293
              check_docker/check_docker.py on lines 305..307
              check_docker/check_swarm.py on lines 107..109

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 35.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Similar blocks of code found in 4 locations. Consider refactoring.
              Invalid

              def get_container_info(name):
                  content, _ = get_url(daemon + '/containers/{container}/json'.format(container=name))
                  return content
              Severity: Major
              Found in check_docker/check_docker.py and 3 other locations - About 45 mins to fix
              check_docker/check_docker.py on lines 296..298
              check_docker/check_docker.py on lines 305..307
              check_docker/check_swarm.py on lines 107..109

              Duplicated Code

              Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

              Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

              When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

              Tuning

              This issue has a mass of 35.

              We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

              The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

              If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

              See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

              Refactorings

              Further Reading

              Rename function "ok" to match the regular expression ^[a-z_][a-z0-9_]{2,}$.
              Wontfix

              def ok(message):
              Severity: Major
              Found in check_docker/check_docker.py by sonar-python

              Shared coding conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.

              Noncompliant Code Example

              With the default provided regular expression: ^[a-z_][a-z0-9_]{2,30}$

              def MyFunction(a,b):
                  ...
              

              Compliant Solution

              def my_function(a,b):
                  ...
              

              There are no issues that match your filters.

              Category
              Status