# Buggy code
def load_modules(self, data=None, proxy=None):
    """
    Load the modules into the state
    """
    log.info("Loading fresh modules for state activity")
    self.utils = salt.loader.utils(self.opts)
    self.functions = salt.loader.minion_mods(
        self.opts, self.state_con, utils=self.utils, proxy=proxy
    )
    if isinstance(data, dict):
        if data.get("provider", False):
            if isinstance(data["provider"], str):
                providers = [{data["state"]: data["provider"]}]
            elif isinstance(data["provider"], list):
                providers = data["provider"]
            else:
                providers = {}
            for provider in providers:
                for mod in provider:
                    funcs = salt.loader.raw_mod(
                        self.opts, provider[mod], self.functions
                    )
                    if funcs:
                        for func in funcs:
                            f_key = "{0}{1}".format(mod, func[func.rindex(".") :])
                            self.functions[f_key] = funcs[func]
    self.serializers = salt.loader.serializers(self.opts)
    self._load_states()
    self.rend = salt.loader.render(self.opts, self.functions, states=self.states)


# Traceback (KeyError)
Invoking the same function in state files

$ salt cluster state.show_highstate
cluster:
- Rendering SLS 'base:esxcluster' failed: Jinja error: 'esxcluster.get_details'
Traceback (most recent call last):
File "/var/tmp/bleotu/virtual/saltstack/install/common/lib/salt/utils/templates.py", line 368, in render_jinja_tmpl
output = template.render(**decoded_context)
File ".../jinja2/2.7.3-py27/lib/Jinja2-2.7.3-py2.7.egg/jinja2/environment.py", line 969, in render
return self.environment.handle_exception(exc_info, True)
File ".../jinja2/2.7.3-py27/lib/Jinja2-2.7.3-py2.7.egg/jinja2/environment.py", line 742, in handle_exception
reraise(exc_type, exc_value, tb)
File "<template>", line 29, in top-level template code
File "/var/tmp/bleotu/virtual/saltstack/install/common/lib/salt/modules/vsphere.py", line 262, in __supports_proxies
return fn(*args, **clean_kwargs(**kwargs))
File "/var/tmp/bleotu/virtual/saltstack/install/common/lib/salt/modules/vsphere.py", line 295, in _gets_service_instance_via_proxy
connection_details = _get_proxy_connection_details()
File "/var/tmp/bleotu/virtual/saltstack/install/common/lib/salt/modules/vsphere.py", line 233, in _get_proxy_connection_details
details = __salt__['esxcluster.get_details']()
File "/var/tmp/bleotu/virtual/saltstack/install/common/lib/salt/modules/esxcluster.py", line 29, in get_details
return __proxy__['esxcluster.get_details']()
File "/var/tmp/bleotu/virtual/saltstack/install/common/lib/salt/utils/context.py", line 191, in __getitem__
return self._dict()[key]
KeyError: 'esxcluster.get_details'

; line 29

---
[...]
esxcluster.cluster_configured:
- {{ cluster_config }}
{%- endif %}

{%- if esxcluster_states_enabled.get('cluster_vsan_datastore') %}
{%- if pillar.get('vsan', {}).get('datastore_name') and     <======================
**salt['vsphere.get_cluster_vsan_data']()**.get('datastore_name') %}
cluster_vsan_datastore:
esxcluster.vsan_datastore_configured:
- datastore_name : {{ pillar['vsan']['datastore_name'] }}
{%- endif %}
[...]
---

# Fixed code
def load_modules(self, data=None, proxy=None):
    """
    Load the modules into the state
    """
    log.info("Loading fresh modules for state activity")
    self.utils = salt.loader.utils(self.opts)
    self.functions = salt.loader.minion_mods(
        self.opts, self.state_con, utils=self.utils, proxy=self.proxy
    )
    if isinstance(data, dict):
        if data.get("provider", False):
            if isinstance(data["provider"], str):
                providers = [{data["state"]: data["provider"]}]
            elif isinstance(data["provider"], list):
                providers = data["provider"]
            else:
                providers = {}
            for provider in providers:
                for mod in provider:
                    funcs = salt.loader.raw_mod(
                        self.opts, provider[mod], self.functions
                    )
                    if funcs:
                        for func in funcs:
                            f_key = "{0}{1}".format(mod, func[func.rindex(".") :])
                            self.functions[f_key] = funcs[func]
    self.serializers = salt.loader.serializers(self.opts)
    self._load_states()
    self.rend = salt.loader.render(self.opts, self.functions, states=self.states)