docstr: Zip the contents of an entire folder (with that folder included
  in the archive). Empty subfolders will be included in the archive
  as well.
code: def zip_folder(self, folder_path, output_path):
      """Zip the contents of an entire folder (with that folder included
      in the archive). Empty subfolders will be included in the archive
      as well.
      """
      # Retrieve the paths of the folder contents.
      contents = os.walk(folder_path)
      try:
          zip_file = zipfile.ZipFile(
              output_path, "w", zipfile.ZIP_DEFLATED
          )
          for root, folders, files in contents:
              # Include all subfolders, including empty ones.
              for folder_name in folders:
                  absolute_path = os.path.join(root, folder_name)
                  relative_path = absolute_path.replace(folder_path, "")
                  zip_file.write(absolute_path, relative_path)
              for file_name in files:
                  if file_name != "datmo_model.zip":
                      absolute_path = os.path.join(root, file_name)
                      relative_path = absolute_path.replace(
                          folder_path, ""
                      )
                      zip_file.write(absolute_path, relative_path)
      except IOError as err:
          _, strerror = err.args
          self.log.info(strerror)
          sys.exit(1)
      except OSError as err:
          _, strerror = err.args
          self.log.info(strerror)
          sys.exit(1)
      except zipfile.BadZipfile as err:
          _, strerror = err.args
          self.log.info(strerror)
          sys.exit(1)
      finally:
          zip_file.close()
  
imports: import os
  import re
  import ast
  import hashlib
  import textwrap
  import datetime
  import pytz
  import tzlocal
  import pytest
  import collections
  import platform
  import tempfile
  import subprocess
  import zipfile
  import sys
  import shutil
  import requests
  from enum import Enum
  from io import open
  from glob import glob
  from datmo.core.controller.environment.driver.dockerenv import DockerEnvironmentDriver
  from datmo.core.util.i18n import get
  from datmo.core.util.exceptions import PathDoesNotExist, MutuallyExclusiveArguments, RequiredArgumentMissing, EnvironmentConnectFailed, EnvironmentExecutionError, InvalidDestinationName, TooManyArgumentsFound
label_desc: Use image node_id 5 for calling the Commands obj's underlying member method code with example usage: obj.zip_folder(folder_path, output_path) without return types