feat(storage): add EmptyDir and HostPath as storage and polish README
diff --git a/README.md b/README.md
index 13936d3..eb7e396 100644
--- a/README.md
+++ b/README.md
@@ -79,7 +79,7 @@
   # size is the the name service instance number of the name service cluster
   size: 1
   # nameServiceImage is the customized docker image repo of the RocketMQ name service
-  nameServiceImage: docker.io/library/rocketmq-namesrv:4.5.0-alpine
+  nameServiceImage: 2019liurui/rocketmq-namesrv:4.5.0-alpine
   # imagePullPolicy is the image pull policy
   imagePullPolicy: Always
   # volumeClaimTemplates defines the storageClass
@@ -113,7 +113,7 @@
   # replicaPerGroup is the number of each broker cluster
   replicaPerGroup: 1
   # brokerImage is the customized docker image repo of the RocketMQ broker
-  brokerImage: docker.io/library/rocketmq-broker:4.5.0-alpine
+  brokerImage: 2019liurui/rocketmq-broker:4.5.0-alpine
   # imagePullPolicy is the image pull policy
   imagePullPolicy: Always
   # allowRestart defines whether allow pod restart
diff --git a/create-operator.sh b/create-operator.sh
index f3f1635..c676c7c 100755
--- a/create-operator.sh
+++ b/create-operator.sh
@@ -18,7 +18,7 @@
 set -eux;
 
 # Change the DOCKERHUB_REPO to your docker repo
-DOCKERHUB_REPO="docker.io/library/rocketmq-operator:v0.0.1-snapshot"
+DOCKERHUB_REPO="2019liurui/rocketmq-operator:v0.0.1-snapshot"
 
 export GO111MODULE=on
 
diff --git a/deploy/operator.yaml b/deploy/operator.yaml
index ac8ffa1..cdd7b91 100644
--- a/deploy/operator.yaml
+++ b/deploy/operator.yaml
@@ -31,7 +31,7 @@
       containers:
         - name: rocketmq-operator
           # Replace this with the built image name
-          image: docker.io/library/rocketmq-operator:v0.0.1-snapshot
+          image: 2019liurui/rocketmq-operator:v0.0.1-snapshot
           command:
           - rocketmq-operator
           imagePullPolicy: Always
diff --git a/example/rocketmq_v1alpha1_broker_cr.yaml b/example/rocketmq_v1alpha1_broker_cr.yaml
index b8aae82..18ab6b4 100644
--- a/example/rocketmq_v1alpha1_broker_cr.yaml
+++ b/example/rocketmq_v1alpha1_broker_cr.yaml
@@ -16,6 +16,7 @@
 apiVersion: rocketmq.apache.org/v1alpha1
 kind: Broker
 metadata:
+  # name of broker cluster
   name: broker
 spec:
   # size is the number of the broker cluster, each broker cluster contains a master broker and [replicaPerGroup] replica brokers.
@@ -27,11 +28,15 @@
   # replicaPerGroup is the number of each broker cluster
   replicaPerGroup: 1
   # brokerImage is the customized docker image repo of the RocketMQ broker
-  brokerImage: docker.io/library/rocketmq-broker:4.5.0-alpine
+  brokerImage: 2019liurui/rocketmq-broker:4.5.0-alpine
   # imagePullPolicy is the image pull policy
   imagePullPolicy: Always
   # allowRestart defines whether allow pod restart
   allowRestart: false
+  # storageMode can be EmptyDir, HostPath, NFS
+  storageMode: HostPath
+  # hostPath is the local path to store data
+  hostPath: /data/rocketmq/broker
   # volumeClaimTemplates defines the storageClass
   volumeClaimTemplates:
     - metadata:
diff --git a/example/rocketmq_v1alpha1_nameservice_cr.yaml b/example/rocketmq_v1alpha1_nameservice_cr.yaml
index 5505da4..85063a3 100644
--- a/example/rocketmq_v1alpha1_nameservice_cr.yaml
+++ b/example/rocketmq_v1alpha1_nameservice_cr.yaml
@@ -21,9 +21,13 @@
   # size is the the name service instance number of the name service cluster
   size: 1
   # nameServiceImage is the customized docker image repo of the RocketMQ name service
-  nameServiceImage: docker.io/library/rocketmq-namesrv:4.5.0-alpine
+  nameServiceImage: 2019liurui/rocketmq-namesrv:4.5.0-alpine
   # imagePullPolicy is the image pull policy
   imagePullPolicy: Always
+  # storageMode can be EmptyDir, HostPath, NFS
+  storageMode: HostPath
+  # hostPath is the local path to store data
+  hostPath: /data/rocketmq/nameserver
   # volumeClaimTemplates defines the storageClass
   volumeClaimTemplates:
     - metadata:
diff --git a/images/broker/build-broker-image.sh b/images/broker/build-broker-image.sh
index 5c6c711..8e96748 100755
--- a/images/broker/build-broker-image.sh
+++ b/images/broker/build-broker-image.sh
@@ -33,7 +33,7 @@
 fi
 
 ROCKETMQ_VERSION=$1
-DOCKERHUB_REPO=docker.io/library/rocketmq-broker
+DOCKERHUB_REPO=2019liurui/rocketmq-broker
 
 checkVersion $ROCKETMQ_VERSION
 
diff --git a/images/namesrv/build-namesrv-image.sh b/images/namesrv/build-namesrv-image.sh
index 82aa811..e4304f0 100755
--- a/images/namesrv/build-namesrv-image.sh
+++ b/images/namesrv/build-namesrv-image.sh
@@ -33,7 +33,7 @@
 fi
 
 ROCKETMQ_VERSION=$1
-DOCKERHUB_REPO=docker.io/library/rocketmq-namesrv
+DOCKERHUB_REPO=2019liurui/rocketmq-namesrv
 
 checkVersion $ROCKETMQ_VERSION
 
diff --git a/images/try-images.sh b/images/try-images.sh
index 1b1d129..115457b 100755
--- a/images/try-images.sh
+++ b/images/try-images.sh
@@ -15,8 +15,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-NAMESRV_DOCKERHUB_REPO=docker.io/library/rocketmq-namesrv
-BROKER_DOCKERHUB_REPO=docker.io/library/rocketmq-broker
+NAMESRV_DOCKERHUB_REPO=2019liurui/rocketmq-namesrv
+BROKER_DOCKERHUB_REPO=2019liurui/rocketmq-broker
 ROCKETMQ_VERSION=4.5.0
 
 start_namesrv_broker()
diff --git a/pkg/controller/broker/broker_controller.go b/pkg/controller/broker/broker_controller.go
index 2101ce3..42f4a1c 100644
--- a/pkg/controller/broker/broker_controller.go
+++ b/pkg/controller/broker/broker_controller.go
@@ -382,7 +382,7 @@
 							SubPath:   cons.StoreSubPathName,
 						}},
 					}},
-					Volumes: getVolumes(broker),
+					Volumes: getVolumes(broker, true, brokerGroupIndex, replicaIndex),
 				},
 			},
 			VolumeClaimTemplates: getVolumeClaimTemplates(broker),
@@ -399,16 +399,14 @@
 	switch broker.Spec.StorageMode {
 	case cons.StorageModeNFS:
 		return broker.Spec.VolumeClaimTemplates
-	case cons.StorageModeEmptyDir:
-		fallthrough
-	case cons.StorageModeHostPath:
+	case cons.StorageModeEmptyDir, cons.StorageModeHostPath:
 		fallthrough
 	default:
 		return nil
 	}
 }
 
-func getVolumes(broker *rocketmqv1alpha1.Broker) []corev1.Volume {
+func getVolumes(broker *rocketmqv1alpha1.Broker, isReplica bool, brokerGroupIndex int, replicaIndex int) []corev1.Volume {
 	switch broker.Spec.StorageMode {
 	case cons.StorageModeNFS:
 		return nil
@@ -428,13 +426,21 @@
 			Name: broker.Spec.VolumeClaimTemplates[0].Name,
 			VolumeSource: corev1.VolumeSource{
 				HostPath: &corev1.HostPathVolumeSource{
-					Path: broker.Spec.HostPath,
+					Path: broker.Spec.HostPath + getHostPathSuffix(broker, isReplica, brokerGroupIndex, replicaIndex),
 				}},
 		}}
 		return volumes
 	}
 }
 
+func getHostPathSuffix(broker *rocketmqv1alpha1.Broker, isReplica bool, brokerGroupIndex int, replicaIndex int) string {
+	if isReplica {
+		return "/" + broker.Name + "-" + strconv.Itoa(brokerGroupIndex) + "-replica-" + strconv.Itoa(replicaIndex)
+	} else {
+		return "/" + broker.Name + "-" + strconv.Itoa(brokerGroupIndex) + "-master-" + strconv.Itoa(replicaIndex)
+	}
+}
+
 // labelsForBroker returns the labels for selecting the resources
 // belonging to the given broker CR name.
 func labelsForBroker(name string) map[string]string {
diff --git a/pkg/controller/nameservice/nameservice_controller.go b/pkg/controller/nameservice/nameservice_controller.go
index 5395771..ff1d0be 100644
--- a/pkg/controller/nameservice/nameservice_controller.go
+++ b/pkg/controller/nameservice/nameservice_controller.go
@@ -284,15 +284,15 @@
 	return map[string]string{"app": "name_service", "name_service_cr": name}
 }
 
-func (r *ReconcileNameService) statefulSetForNameService(m *rocketmqv1alpha1.NameService) *appsv1.StatefulSet {
-	ls := labelsForNameService(m.Name)
+func (r *ReconcileNameService) statefulSetForNameService(nameService *rocketmqv1alpha1.NameService) *appsv1.StatefulSet {
+	ls := labelsForNameService(nameService.Name)
 	dep := &appsv1.StatefulSet{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      m.Name,
-			Namespace: m.Namespace,
+			Name:      nameService.Name,
+			Namespace: nameService.Namespace,
 		},
 		Spec: appsv1.StatefulSetSpec{
-			Replicas: &m.Spec.Size,
+			Replicas: &nameService.Spec.Size,
 			Selector: &metav1.LabelSelector{
 				MatchLabels: ls,
 			},
@@ -304,27 +304,28 @@
 					HostNetwork: true,
 					DNSPolicy: "ClusterFirstWithHostNet",
 					Containers: []corev1.Container{{
-						Image:           m.Spec.NameServiceImage,
+						Image: nameService.Spec.NameServiceImage,
 						// Name must be lower case !
 						Name:            "name-service",
-						ImagePullPolicy: m.Spec.ImagePullPolicy,
+						ImagePullPolicy: nameService.Spec.ImagePullPolicy,
 						Ports: []corev1.ContainerPort{{
 							ContainerPort: cons.NameServiceMainContainerPortNumber,
 							Name:          cons.NameServiceMainContainerPortName,
 						}},
 						VolumeMounts: []corev1.VolumeMount{{
 							MountPath: cons.LogMountPath,
-							Name: m.Spec.VolumeClaimTemplates[0].Name,
-							SubPath: cons.LogSubPathName,
+							Name:      nameService.Spec.VolumeClaimTemplates[0].Name,
+							SubPath:   cons.LogSubPathName,
 						}},
 					}},
+					Volumes: getVolumes(nameService),
 				},
 			},
-			VolumeClaimTemplates: m.Spec.VolumeClaimTemplates,
+			VolumeClaimTemplates: getVolumeClaimTemplates(nameService),
 		},
 	}
 	// Set Broker instance as the owner and controller
-	controllerutil.SetControllerReference(m, dep, r.scheme)
+	controllerutil.SetControllerReference(nameService, dep, r.scheme)
 
 	return dep
 }