Skip to content

Commit 445dff6

Browse files
committed
Fix and optimize the counter demo
Signed-off-by: Daniel Li <[email protected]>
1 parent eb4e6e4 commit 445dff6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+3448
-0
lines changed

new-counter-demo/Makefile

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
.PHONY: clean build-webUI build-mapper deploy-webUI deploy-mapper undeploy-webUI undeploy-mapper
2+
clean: undeploy-webUI undeploy-mapper
3+
build-webUI:
4+
docker build -f ./webUI/Dockerfile -t counter-webui:v1.0 ./webUI
5+
kind load docker-image counter-webui:v1.0 --nodes=kind-control-plane
6+
build-mapper:
7+
docker build -f ./virtualprotocol/Dockerfile_nostream -t counter-mapper:v1.0 ./virtualprotocol
8+
kind load docker-image counter-mapper:v1.0 --nodes=kind-worker
9+
10+
deploy-webUI:
11+
kubectl apply -f ./webUI/resource/deploy.yaml
12+
13+
deploy-mapper:
14+
kubectl apply -f ./virtualprotocol/resource/configmap.yaml
15+
kubectl apply -f ./virtualprotocol/resource/deployment.yaml
16+
sleep 3
17+
kubectl apply -f ./crds/counter-model.yaml
18+
kubectl apply -f ./crds/counter-instance.yaml
19+
20+
undeploy-webUI:
21+
kubectl delete -f ./webUI/resource
22+
undeploy-mapper:
23+
kubectl delete -f ./virtualprotocol/resource/configmap.yaml
24+
kubectl delete -f ./virtualprotocol/resource/deployment.yaml
25+
kubectl delete -f ./crds/counter-model.yaml
26+
kubectl delete -f ./crds/counter-instance.yaml

new-counter-demo/README.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# New Counter Demo
2+
3+
## Description
4+
Counter is a virtual device that uses VirtualProtocol, so users can run the demo without an additional physical device.
5+
6+
## Feature
7+
- Status Control: Supports Start/Pause/Shutdown operations
8+
- Customizable Start Value: Enter a number to set the initial counter value
9+
- Real-time Update: Counter status and value automatically refresh every second
10+
- Visual Feedback: Different statuses (Running/Paused/Stopped) are displayed in different colors
11+
12+
## Structure
13+
![structure](./img/structure.png)
14+
15+
## Prerequisites
16+
- Docker
17+
- KubeEdge v1.21+
18+
19+
## Quick Start
20+
### Clone the repository and enter the demo directory
21+
```
22+
git clone https://github.com/kubeedge/examples.git
23+
cd examples/new-counter-demo
24+
```
25+
26+
### Mapper ✅(At the edge)
27+
1. Build the mapper image
28+
```
29+
make build-mapper
30+
```
31+
2. Deploy the mapper
32+
```
33+
make deploy-mapper
34+
```
35+
36+
37+
### WebUI ✅(At the cloud)
38+
1. Build the webUI image
39+
```
40+
make build-webUI
41+
```
42+
2. Deploy the webUI
43+
```
44+
make deploy-webUI
45+
```
46+
3. Open the Web Browser and go to the URL
47+
```
48+
http://127.0.0.1:8080
49+
```
50+
51+
## Test
52+
![test](./img/counter-demo.gif)
53+
54+
55+
56+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
apiVersion: devices.kubeedge.io/v1beta1
2+
kind: Device
3+
metadata:
4+
name: counter-instance
5+
namespace: default
6+
spec:
7+
deviceModelRef:
8+
name: counter-model
9+
nodeName: "kind-worker"
10+
protocol:
11+
protocolName: virtualProtocol
12+
configData:
13+
# ip: "172.18.0.3"
14+
15+
properties:
16+
- name: status
17+
visitors:
18+
configData:
19+
name: status
20+
collectCycle: 10000
21+
reportCycle: 10000
22+
reportToCloud: true
23+
- name: count
24+
visitors:
25+
configData:
26+
name: count
27+
collectCycle: 1000
28+
reportCycle: 10000
29+
reportToCloud: true
30+
# pushMethod:
31+
# mqtt:
32+
# topic: "current count"
33+
# qos: 0
34+
# address: "tcp://127.0.0.1:1884" # replace the address with your mqtt broker address
35+
# retained: false
36+
methods:
37+
- name: UpdateStatus
38+
description: update status of counter. 0=ON,1=OFF 2=PAUSED
39+
propertyNames:
40+
- status
41+
- name: SetCount
42+
description: set count of counter
43+
propertyNames:
44+
- count
45+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: devices.kubeedge.io/v1beta1
2+
kind: DeviceModel
3+
metadata:
4+
name: counter-model
5+
namespace: default
6+
spec:
7+
protocol: "virtualProtocol"
8+
properties:
9+
- name: status
10+
description: counter status:0=ON,1=OFF 2=PAUSED
11+
type: STRING
12+
accessMode: ReadWrite
13+
- name: count
14+
description: counter count
15+
type: STRING
16+
accessMode: ReadWrite
233 KB
Loading

new-counter-demo/img/structure.png

46.8 KB
Loading
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
FROM golang:1.23.3-alpine3.19 AS builder
2+
3+
WORKDIR /build
4+
5+
ENV GO111MODULE=on \
6+
GOPROXY=https://goproxy.cn,direct
7+
8+
COPY . .
9+
10+
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o main ./cmd/main.go
11+
12+
FROM ubuntu:22.04
13+
14+
RUN mkdir -p kubeedge
15+
16+
COPY --from=builder /build/main kubeedge/
17+
18+
COPY ./config.yaml kubeedge/
19+
20+
WORKDIR kubeedge
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
FROM golang:1.21.11-bullseye AS builder
2+
3+
WORKDIR /build
4+
5+
ENV GO111MODULE=on \
6+
GOPROXY=https://goproxy.cn,direct
7+
8+
COPY . .
9+
10+
RUN apt-get update && \
11+
apt-get install -y bzip2 curl upx-ucl gcc-aarch64-linux-gnu libc6-dev-arm64-cross gcc-arm-linux-gnueabi libc6-dev-armel-cross libva-dev libva-drm2 libx11-dev libvdpau-dev libxext-dev libsdl1.2-dev libxcb1-dev libxau-dev libxdmcp-dev yasm
12+
13+
RUN curl -sLO https://ffmpeg.org/releases/ffmpeg-4.1.6.tar.bz2 && \
14+
tar -jx --strip-components=1 -f ffmpeg-4.1.6.tar.bz2 && \
15+
./configure && make && \
16+
make install
17+
18+
RUN GOOS=linux go build -o main cmd/main.go
19+
20+
FROM ubuntu:18.04
21+
22+
RUN mkdir -p kubeedge
23+
24+
RUN apt-get update && \
25+
apt-get install -y bzip2 curl upx-ucl gcc-aarch64-linux-gnu libc6-dev-arm64-cross gcc-arm-linux-gnueabi libc6-dev-armel-cross libva-dev libva-drm2 libx11-dev libvdpau-dev libxext-dev libsdl1.2-dev libxcb1-dev libxau-dev libxdmcp-dev yasm
26+
27+
RUN curl -sLO https://ffmpeg.org/releases/ffmpeg-4.1.6.tar.bz2 && \
28+
tar -jx --strip-components=1 -f ffmpeg-4.1.6.tar.bz2 && \
29+
./configure && make && \
30+
make install
31+
32+
COPY --from=builder /build/main kubeedge/
33+
COPY ./config.yaml kubeedge/
34+
35+
WORKDIR kubeedge
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
SHELL := /bin/bash
2+
3+
curr_dir := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
4+
rest_args := $(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
5+
$(eval $(rest_args):;@:)
6+
7+
help:
8+
#
9+
# Usage:
10+
# make generate : generate a mapper based on a template.
11+
# make mapper {mapper-name} <action> <parameter>: execute mapper building process.
12+
#
13+
# Actions:
14+
# - mod, m : download code dependencies.
15+
# - lint, l : verify code via go fmt and `golangci-lint`.
16+
# - build, b : compile code.
17+
# - package, p : package docker image.
18+
# - clean, c : clean output binary.
19+
#
20+
# Parameters:
21+
# ARM : true or undefined
22+
# ARM64 : true or undefined
23+
#
24+
# Example:
25+
# - make mapper modbus ARM64=true : execute `build` "modbus" mapper for ARM64.
26+
# - make mapper modbus test : execute `test` "modbus" mapper.
27+
@echo
28+
29+
make_rules := $(shell ls $(curr_dir)/hack/make-rules | sed 's/.sh//g')
30+
$(make_rules):
31+
@$(curr_dir)/hack/make-rules/$@.sh $(rest_args)
32+
33+
.DEFAULT_GOAL := help
34+
.PHONY: $(make_rules) build test package
35+
36+
37+
docker-build:
38+
docker build -f ./Dockerfile_nostream -t counter-mapper:v1.0 .
39+
kind load docker-image counter-mapper:v1.0 --nodes=kind-worker
40+
build-app:
41+
CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o main ./cmd/main.go
42+
docker cp ./main kind-worker:./srv
43+
44+
redeploy-crds:
45+
kubectl delete -f ../crds/counter-instance.yaml
46+
kubectl delete -f ../crds/counter-model.yaml
47+
kubectl apply -f ../crds/counter-model.yaml
48+
kubectl apply -f ../crds/counter-instance.yaml
49+
deploy-crds:
50+
kubectl apply -f ../crds/
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
6+
"k8s.io/klog/v2"
7+
8+
"github.com/kubeedge/mapper-framework/pkg/common"
9+
"github.com/kubeedge/mapper-framework/pkg/config"
10+
"github.com/kubeedge/mapper-framework/pkg/grpcclient"
11+
"github.com/kubeedge/mapper-framework/pkg/grpcserver"
12+
"github.com/kubeedge/mapper-framework/pkg/httpserver"
13+
"github.com/kubeedge/virtualprotocol/device"
14+
15+
)
16+
17+
func main() {
18+
19+
var err error
20+
var c *config.Config
21+
22+
klog.InitFlags(nil)
23+
defer klog.Flush()
24+
25+
if c, err = config.Parse(); err != nil {
26+
klog.Fatal(err)
27+
}
28+
klog.Infof("config: %+v", c)
29+
30+
klog.Infoln("Mapper will register to edgecore")
31+
deviceList, deviceModelList, err := grpcclient.RegisterMapper(true)
32+
if err != nil {
33+
klog.Fatal(err)
34+
}
35+
klog.Infoln("Mapper register finished")
36+
37+
panel := device.NewDevPanel()
38+
err = panel.DevInit(deviceList, deviceModelList)
39+
if err != nil && !errors.Is(err, device.ErrEmptyData) {
40+
klog.Fatal(err)
41+
}
42+
klog.Infoln("devInit finished")
43+
go panel.DevStart()
44+
45+
// start http server
46+
httpServer := httpserver.NewRestServer(panel, c.Common.HTTPPort)
47+
go httpServer.StartServer()
48+
49+
// start grpc server
50+
grpcServer := grpcserver.NewServer(
51+
grpcserver.Config{
52+
SockPath: c.GrpcServer.SocketPath,
53+
Protocol: common.ProtocolCustomized,
54+
},
55+
panel,
56+
)
57+
defer grpcServer.Stop()
58+
if err = grpcServer.Start(); err != nil {
59+
klog.Fatal(err)
60+
}
61+
62+
}

0 commit comments

Comments
 (0)