func (iidRWLock *IIDRWLOCK)GetIID(iidGroup IIDGroup, connectionName string, resourceType string, iId resources.IID) (*IIDInfo, error) {
	cblog.Info("call GetIID()")
        cblog.Debug("check params")
        err := checkParams(connectionName, resourceType, &iId)
        if err != nil {
                return nil, err
        }
iidRWLock.rwMutex.RLock()
defer iidRWLock.rwMutex.RUnlock()
	iId.NameId = strings.ReplaceAll(iId.NameId, "/", "%2F")
	iidInfo, err := getInfo(iidGroup, connectionName, resourceType, iId.NameId)
	if err != nil {
                cblog.Error(err)
                return nil, err
        }
        iidInfo.IId.NameId = strings.ReplaceAll(iidInfo.IId.NameId, "%2F", "/")
	return iidInfo, err
}
1. check params
2. get IIDInfo from cb-store
package iidmanager
import (
	"fmt"
	"sync"
	"strings"
	"github.com/rs/xid"
	"regexp"
	"github.com/sirupsen/logrus"
	"github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces/resources"
	"github.com/cloud-barista/cb-store/config"
	ccim "github.com/cloud-barista/cb-spider/cloud-info-manager/connection-config-info-manager"
)
var cblog *logrus.Logger
func init() {
        cblog = config.Cblogger
}
type IIDRWLOCK struct {
        rwMutex	sync.RWMutex  
}
type IIDInfo struct {
        ConnectionName  string   
        ResourceType    string   
        IId             resources.IID   
}
func (iidRWLock *IIDRWLOCK)IsExistIID(iidGroup IIDGroup, connectionName string, resourceType string, iId resources.IID) (bool, error) {
        cblog.Debug("check the IID.NameId:" + iId.NameId + " existence")
iidRWLock.rwMutex.RLock()
defer iidRWLock.rwMutex.RUnlock()
	iId.NameId = strings.ReplaceAll(iId.NameId, "/", "%2F")
        return isExist(iidGroup, connectionName, resourceType, iId.NameId)
}
func (iidRWLock *IIDRWLOCK)CreateIID(iidGroup IIDGroup, connectionName string, resourceType string, iId resources.IID) (*IIDInfo, error) {
	cblog.Debug("check the IID.NameId:" + iId.NameId + " existence")
iidRWLock.rwMutex.Lock()
defer iidRWLock.rwMutex.Unlock()
	iId.NameId = strings.ReplaceAll(iId.NameId, "/", "%2F")
	ret, err := isExist(iidGroup, connectionName, resourceType, iId.NameId)
	if err != nil {
		cblog.Error(err)
		return nil, err
	}
	if ret == true {
		return nil, fmt.Errorf(iId.NameId + " already exists!")
	}
	iidInfo, err2 := forceCreateIID(iidGroup, connectionName, resourceType, iId)
	if err2 != nil {
		cblog.Error(err2)
		return nil, err2
	}
	iidInfo.IId.NameId = strings.ReplaceAll(iidInfo.IId.NameId, "%2F", "/")
	return iidInfo, err2
}
func (iidRWLock *IIDRWLOCK)UpdateIID(iidGroup IIDGroup, connectionName string, resourceType string, iId resources.IID) (*IIDInfo, error) {
        cblog.Debug("check the IID.NameId:" + iId.NameId + " existence")
iidRWLock.rwMutex.Lock()
defer iidRWLock.rwMutex.Unlock()
	iId.NameId = strings.ReplaceAll(iId.NameId, "/", "%2F")
        ret, err := isExist(iidGroup, connectionName, resourceType, iId.NameId)
        if err != nil {
                cblog.Error(err)
                return nil, err
        }
        if ret == false {
                return nil, fmt.Errorf(iId.NameId + " does not exists!")
        }
        iidInfo, err2 := forceCreateIID(iidGroup, connectionName, resourceType, iId)
	if err2 != nil {
		cblog.Error(err2)
		return nil, err2
	}
        iidInfo.IId.NameId = strings.ReplaceAll(iidInfo.IId.NameId, "%2F", "/")
        return iidInfo, err2
}
func forceCreateIID(iidGroup IIDGroup, connectionName string, resourceType string, iId resources.IID) (*IIDInfo, error) {
	cblog.Info("call CreateIID()")
	cblog.Debug("check params")
	err := checkParams(connectionName, resourceType, &iId)
	if err != nil {
		return nil, err
	}
	cblog.Debug("insert metainfo into store")
        err = insertInfo(iidGroup, connectionName, resourceType, iId)
        if err != nil {
                cblog.Error(err)
                return nil, err
        }
	iidInfo := &IIDInfo{connectionName, resourceType, iId}
	return iidInfo, nil
}
func (iidRWLock *IIDRWLOCK)ListIID(iidGroup IIDGroup, connectionName string, resourceType string) ([]*IIDInfo, error) {
	cblog.Info("call ListIID()")
iidRWLock.rwMutex.RLock()
defer iidRWLock.rwMutex.RUnlock()
        iIDInfoList, err := listInfo(iidGroup, connectionName, resourceType)
        if err != nil {
                return nil, err
        }
	for i, iidInfo := range iIDInfoList {
		iIDInfoList[i].IId.NameId = strings.ReplaceAll(iidInfo.IId.NameId, "%2F", "/")
	}
        return iIDInfoList, nil
}
func (iidRWLock *IIDRWLOCK)ListResourceType(iidGroup IIDGroup, connectionName string) ([]string, error) {
        cblog.Info("call ListResourceType()")
iidRWLock.rwMutex.RLock()
defer iidRWLock.rwMutex.RUnlock()
        resourceTypeList, err := listResourceType(iidGroup, connectionName)
        if err != nil {
                return nil, err
        }
        for i, rsType := range resourceTypeList {
                resourceTypeList[i] = strings.ReplaceAll(rsType, "%2F", "/")
        }
        return resourceTypeList, nil
}