code: def rotation_state(self) -> RotationState:
      active_key = self.active_user_key()
  
      # Solely system-managed accounts are always up to date
      if not active_key:
          return RotationState.UP_TO_DATE
  
      old_user_keys = self.redundant_user_keys()
      if active_key.expired():
          return RotationState.EXPIRED
      elif active_key.recently_created() and len(old_user_keys) > 0:
          return RotationState.IN_PROGRESS
      elif not active_key.recently_created() and len(old_user_keys) > 0:
          return RotationState.READY_FOR_DELETE
      elif active_key.soon_to_expire():
          return RotationState.SOON_TO_EXPIRE
      else:
          assert len(old_user_keys) == 0
          return RotationState.UP_TO_DATE
  
imports: import asyncio
  import base64
  import itertools
  import json
  import sys
  import warnings
  from datetime import datetime, timedelta
  from enum import Enum
  from typing import Generator, List, Optional, TextIO, Tuple, Any, TypedDict, Set, Dict
  import kubernetes_asyncio.client
  import kubernetes_asyncio.config
  import pytz
  from dateutil.parser import isoparse
  from hailtop.aiocloud.aiogoogle import GoogleIAmClient
  from hailtop.utils import retry_transient_errors
label_desc: Use image node_id 5 for calling the ServiceAccount obj's underlying member method code with example usage: obj.rotation_state() and returns: RotationState, RotationState, RotationState, RotationState, RotationState, RotationState