[SDNC] Add Ves collector config
[oom.git] / kubernetes / sdnc / values.yaml
1 # Copyright © 2020 Samsung Electronics, highstreet technologies GmbH
2 # Copyright © 2017 Amdocs, Bell Canada
3 # Copyright © 2021 Nokia
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #       http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 #################################################################
18 # Global configuration defaults.
19 #################################################################
20 global:
21   nodePortPrefix: 302
22   nodePortPrefixExt: 304
23   persistence:
24     mountPath: /dockerdata-nfs
25   aafEnabled: true
26   mariadbGalera:
27     #This flag allows SO to instantiate its own mariadb-galera cluster
28     #If shared instance is used, this chart assumes that DB already exists
29     localCluster: false
30     service: mariadb-galera
31     internalPort: 3306
32     nameOverride: mariadb-galera
33
34 #################################################################
35 # Secrets metaconfig
36 #################################################################
37 secrets:
38   - uid: db-root-password
39     name: &rootDbSecret '{{ include "common.release" . }}-sdnc-db-root-password'
40     type: password
41     # If we're using shared mariadb, we need to use the secret name (second
42     # part).
43     # If not, we do the same trick than for user db secret hat allows you
44     # override this secret using external one with the same field that is used
45     # to pass this to subchart.
46     externalSecret: '{{ .Values.global.mariadbGalera.localCluster |
47       ternary ((hasSuffix "sdnc-db-root-password" (index .Values "mariadb-galera" "rootUser" "externalSecret")) |
48                   ternary
49                     ""
50                     (tpl (default "" (index .Values "mariadb-galera" "rootUser" "externalSecret")) .))
51               (include "common.mariadb.secret.rootPassSecretName"
52                 (dict "dot" .
53                       "chartName" .Values.global.mariadbGalera.nameOverride)) }}'
54     password: '{{ (index .Values "mariadb-galera" "rootUser" "password") }}'
55   - uid: db-secret
56     name: &dbSecretName '{{ include "common.release" . }}-sdnc-db-secret'
57     type: basicAuth
58     # This is a nasty trick that allows you override this secret using external one
59     # with the same field that is used to pass this to subchart
60     externalSecret: '{{ (hasSuffix "sdnc-db-secret" (index .Values "mariadb-galera" "db" "externalSecret")) |
61       ternary
62         ""
63         (tpl (default "" (index .Values "mariadb-galera" "db" "externalSecret")) .) }}'
64     login: '{{ index .Values "mariadb-galera" "db" "user" }}'
65     password: '{{ index .Values "mariadb-galera" "db" "password" }}'
66   - uid: odl-creds
67     name: &odlCredsSecretName '{{ include "common.release" . }}-sdnc-odl-creds'
68     type: basicAuth
69     externalSecret: '{{ .Values.config.odlCredsExternalSecret }}'
70     login: '{{ .Values.config.odlUser }}'
71     password: '{{ .Values.config.odlPassword }}'
72     # For now this is left hardcoded but should be revisited in a future
73     passwordPolicy: required
74   - uid: dmaap-proxy-creds
75     name: &dmaapProxyCredsSecretName '{{ include "common.release" . }}-sdnc-dmaap-proxy-creds'
76     type: basicAuth
77     externalSecret: '{{ .Values.config.dmaapProxyCredsExternalSecret }}'
78     login: '{{ .Values.config.sdnr.dmaapProxy.user }}'
79     password: '{{ .Values.config.sdnr.dmaapProxy.password }}'
80     # For now this is left hardcoded but should be revisited in a future
81     passwordPolicy: required
82   - uid: netbox-apikey
83     type: password
84     externalSecret: '{{ .Values.config.netboxApikeyExternalSecret }}'
85     password: '{{ .Values.config.netboxApikey }}'
86     passwordPolicy: required
87   - uid: aai-truststore-password
88     type: password
89     externalSecret: '{{ .Values.config.aaiTruststoreExternalSecret }}'
90     password: '{{ .Values.config.aaiTruststorePassword }}'
91     passwordPolicy: required
92   - uid: ansible-truststore-password
93     type: password
94     externalSecret: '{{ .Values.config.ansibleTruststoreExternalSecret }}'
95     password: '{{ .Values.config.ansibleTruststorePassword }}'
96     passwordPolicy: required
97   - uid: truststore-password
98     type: password
99     externalSecret: '{{ .Values.config.truststoreExternalSecret }}'
100     password: '{{ .Values.config.truststorePassword }}'
101     passwordPolicy: required
102   - uid: keystore-password
103     type: password
104     externalSecret: '{{ .Values.config.keystoreExternalSecret }}'
105     password: '{{ .Values.config.keystorePassword }}'
106     passwordPolicy: required
107   - uid: dmaap-authkey
108     type: password
109     externalSecret: '{{ .Values.config.dmaapAuthKeyExternalSecret }}'
110     password: '{{ .Values.config.dmaapAuthKey }}'
111     passwordPolicy: required
112   - uid: aai-user-creds
113     type: basicAuth
114     externalSecret: '{{ .Values.config.aaiCredsExternalSecret}}'
115     login: '{{ .Values.config.aaiUser }}'
116     password: '{{ .Values.config.aaiPassword }}'
117     passwordPolicy: required
118   - uid: so-user-creds
119     type: basicAuth
120     externalSecret: '{{ .Values.config.soCredsExternalSecret}}'
121     login: '{{ .Values.config.soUser }}'
122     password: '{{ .Values.config.soPassword }}'
123     passwordPolicy: required
124   - uid: neng-user-creds
125     type: basicAuth
126     externalSecret: '{{ .Values.config.nengCredsExternalSecret}}'
127     login: '{{ .Values.config.nengUser }}'
128     password: '{{ .Values.config.nengPassword }}'
129     passwordPolicy: required
130   - uid: cds-user-creds
131     type: basicAuth
132     externalSecret: '{{ .Values.config.cdsCredsExternalSecret}}'
133     login: '{{ .Values.config.cdsUser }}'
134     password: '{{ .Values.config.cdsPassword }}'
135     passwordPolicy: required
136   - uid: honeycomb-user-creds
137     type: basicAuth
138     externalSecret: '{{ .Values.config.honeycombCredsExternalSecret}}'
139     login: '{{ .Values.config.honeycombUser }}'
140     password: '{{ .Values.config.honeycombPassword }}'
141     passwordPolicy: required
142   - uid: dmaap-user-creds
143     type: basicAuth
144     externalSecret: '{{ .Values.config.dmaapCredsExternalSecret}}'
145     login: '{{ .Values.config.dmaapUser }}'
146     password: '{{ .Values.config.dmaapPassword }}'
147     passwordPolicy: required
148   - uid: modeling-user-creds
149     type: basicAuth
150     externalSecret: '{{ .Values.config.modelingCredsExternalSecret}}'
151     login: '{{ .Values.config.modelingUser }}'
152     password: '{{ .Values.config.modelingPassword }}'
153     passwordPolicy: required
154   - uid: restconf-creds
155     type: basicAuth
156     externalSecret: '{{ .Values.config.restconfCredsExternalSecret}}'
157     login: '{{ .Values.config.restconfUser }}'
158     password: '{{ .Values.config.restconfPassword }}'
159     passwordPolicy: required
160   - uid: ansible-creds
161     name: &ansibleSecretName '{{ include "common.release" . }}-sdnc-ansible-creds'
162     type: basicAuth
163     externalSecret: '{{ .Values.config.ansibleCredsExternalSecret}}'
164     login: '{{ .Values.config.ansibleUser }}'
165     password: '{{ .Values.config.ansiblePassword }}'
166     passwordPolicy: required
167   - uid: scaleout-creds
168     type: basicAuth
169     externalSecret: '{{ .Values.config.scaleoutCredsExternalSecret}}'
170     login: '{{ .Values.config.scaleoutUser }}'
171     password: '{{ .Values.config.scaleoutPassword }}'
172     passwordPolicy: required
173   - uid: oauth-token-secret
174     type: password
175     externalSecret: '{{ ternary (tpl (default "" .Values.config.sdnr.oauth.tokenExternalSecret) .) "oauth-disabled" .Values.config.sdnr.oauth.enabled }}'
176     password: '{{ .Values.config.sdnr.oauth.tokenSecret }}'
177     passwordPolicy: required
178   - uid: keycloak-secret
179     type: password
180     externalSecret: '{{ ternary (tpl (default "" .Values.config.sdnr.oauth.providersSecrets.keycloakExternalSecret) .) "oauth-disabled" .Values.config.sdnr.oauth.enabled }}'
181     password: '{{ .Values.config.sdnr.oauth.providersSecrets.keycloak }}'
182     passwordPolicy: required
183   - uid: ves-collector-secret
184     type: basicAuth
185     login: '{{ .Values.config.sdnr.vesCollector.username }}'
186     password: '{{ .Values.config.sdnr.vesCollector.password }}'
187 #################################################################
188 # Certificates
189 #################################################################
190 certificates:
191   - mountPath:  /var/custom-certs
192     commonName: sdnc.simpledemo.onap.org
193     dnsNames:
194         - sdnc.simpledemo.onap.org
195     keystore:
196       outputType:
197         - jks
198       passwordSecretRef:
199         create: true
200         name: sdnc-cmpv2-keystore-password
201         key: password
202     issuer:
203       group: certmanager.onap.org
204       kind: CMPv2Issuer
205       name: cmpv2-issuer-onap
206 #################################################################
207 # Application configuration defaults.
208 #################################################################
209 # application images
210
211 pullPolicy: Always
212 image: onap/sdnc-image:2.2.0
213
214 # flag to enable debugging - application support required
215 debugEnabled: false
216
217 # application configuration
218 config:
219   odlUid: 100
220   odlGid: 101
221   odlUser: admin
222   odlPassword: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
223   # odlCredsExternalSecret: some secret
224   netboxApikey: onceuponatimeiplayedwithnetbox20180814
225   # netboxApikeyExternalSecret: some secret
226   aaiTruststorePassword: changeit
227   # aaiTruststoreExternalSecret: some secret
228   ansibleTruststorePassword: changeit
229   # ansibleTruststoreExternalSecret: some secret
230   truststorePassword: adminadmin
231   # truststoreExternalSecret: some secret
232   keystorePassword: adminadmin
233   # keystoreExternalSecret: some secret
234   aaiUser: sdnc@sdnc.onap.org
235   aaiPassword: demo123456!
236   # aaiCredsExternalSecret: some secret
237   soUser: sdncaBpmn
238   soPassword: password1$
239   # soCredsExternalSecret: some secret
240   nengUser: ccsdkapps
241   nengPassword: ccsdkapps
242   # nengCredsExternalSecret: some secret
243   cdsUser: ccsdkapps
244   cdsPassword: ccsdkapps
245   # cdsCredsExternalSecret: some secret
246   honeycombUser: admin
247   honeycombPassword: admin
248   # honeycombCredsExternalSecret: some secret
249   dmaapUser: admin
250   dmaapPassword: admin
251   dmaapAuthKey: "fs20cKwalJ6ry4kX:7Hqm6BDZK47IKxGRkOPFk33qMYs="
252   # dmaapCredsExternalSecret: some secret
253   # dmaapAuthKeyExternalSecret: some secret
254   modelingUser: ccsdkapps
255   modelingPassword: ccsdkapps
256   # modelingCredsExternalSecret: some secret
257   restconfUser: admin
258   restconfPassword: admin
259   # restconfCredsExternalSecret: some secret
260   scaleoutUser: admin
261   scaleoutPassword: admin
262   # scaleoutExternalSecret: some secret
263   ansibleUser: sdnc
264   ansiblePassword: sdnc
265   # ansibleCredsExternalSecret: some secret
266
267   dbSdnctlDatabase: &sdncDbName sdnctl
268   enableClustering: true
269   sdncHome: /opt/onap/sdnc
270   binDir: /opt/onap/sdnc/bin
271   etcDir: /opt/onap/sdnc/data
272   geoEnabled: false
273 # if geoEnabled is set to true here, mysql.geoEnabled must be set to true
274 # if geoEnabled is set to true the following 3 values must be set to their proper values
275   myODLCluster: 127.0.0.1
276   peerODLCluster: 127.0.0.1
277   isPrimaryCluster: true
278   configDir: /opt/onap/sdnc/data/properties
279   ccsdkConfigDir: /opt/onap/ccsdk/data/properties
280   dmaapTopic: SUCCESS
281   dmaapPort: 3904
282   logstashServiceName: log-ls
283   logstashPort: 5044
284   ansibleServiceName: sdnc-ansible-server
285   ansiblePort: 8000
286   javaHome: /opt/java/openjdk
287
288   odl:
289     etcDir: /opt/opendaylight/etc
290     binDir: /opt/opendaylight/bin
291     gcLogDir: /opt/opendaylight/data/log
292     salConfigDir: /opt/opendaylight/system/org/opendaylight/controller/sal-clustering-config
293     salConfigVersion: 1.10.4
294     akka:
295       seedNodeTimeout: 15s
296       circuitBreaker:
297         maxFailures: 10
298         callTimeout: 90s
299         resetTimeout: 30s
300       recoveryEventTimeout: 90s
301     datastore:
302       persistentActorRestartMinBackoffInSeconds: 10
303       persistentActorRestartMaxBackoffInSeconds: 40
304       persistentActorRestartResetBackoffInSeconds: 20
305       shardTransactionCommitTimeoutInSeconds: 120
306       shardIsolatedLeaderCheckIntervalInMillis: 30000
307       operationTimeoutInSeconds: 120
308     javaOptions:
309       maxGCPauseMillis: 100
310       parallelGCThreads : 3
311       numberGCLogFiles: 10
312       minMemory: 512m
313       maxMemory: 2048m
314       gcLogOptions: ""
315       # Next line enables gc logging
316       # gcLogOptions: "-Xlog:gc=trace:file={{.Values.config.odl.gcLogDir}}/gc-%t.log}:time,level,tags:filecount={{.Values.config.odl.javaOptions.numberGCLogFiles}}"
317         # enables sdnr functionality
318   sdnr:
319     enabled: true
320     # mode: web - SDNC contains device manager only plus dedicated webserver service for ODLUX (default),
321     # mode: dm - SDNC contains sdnr device manager + ODLUX components
322     mode: dm
323     # sdnronly: true starts sdnc container with odl and sdnrwt features only
324     sdnronly: false
325     sdnrdbTrustAllCerts: true
326     mountpointRegistrarEnabled: false
327     mountpointStateProviderEnabled: false
328     netconfCallHome:
329       enabled: true
330     #
331     # enable and set dmaap-proxy for mountpointRegistrar
332     dmaapProxy:
333       enabled: false
334       usepwd: true
335       user: addUserHere
336       password: addPasswordHere
337       url: addProxyUrlHere
338     oauth:
339       enabled: false
340       tokenIssuer: ONAP SDNC
341       tokenSecret: secret
342       supportOdlusers: true
343       redirectUri: null
344       publicUrl: none
345       odluxRbac:
346         enabled: true
347       # example definition for a oauth provider
348       providersSecrets:
349         keycloak: d8d7ed52-0691-4353-9ac6-5383e72e9c46
350       providers:
351       - id: keycloak
352         type: KEYCLOAK
353         host: http://keycloak:8080
354         clientId: odlux.app
355         secret: ${KEYCLOAK_SECRET}
356         scope: openid
357         title: ONAP Keycloak Provider
358         roleMapping:
359           mykeycloak: admin
360     vesCollector:
361       enabled: false
362       tls:
363         enabled: true
364       trustAllCertificates: false
365       username: sample1
366       password: sample1
367       address: dcae-ves-collector.onap
368       port: 8443
369       version: v7
370       reportingEntityName: ONAP SDN-R
371       eventLogMsgDetail: SHORT
372
373 # dependency / sub-chart configuration
374 certInitializer:
375   nameOverride: sdnc-cert-initializer
376   truststoreMountpath: /opt/onap/sdnc/data/stores
377   fqdn: "sdnc"
378   app_ns: "org.osaaf.aaf"
379   fqi: "sdnc@sdnc.onap.org"
380   fqi_namespace: org.onap.sdnc
381   public_fqdn: "sdnc.onap.org"
382   aafDeployFqi: "deployer@people.osaaf.org"
383   aafDeployPass: demo123456!
384   cadi_latitude: "38.0"
385   cadi_longitude: "-72.0"
386   credsPath: /opt/app/osaaf/local
387   aaf_add_config: >
388     cd /opt/app/osaaf/local;
389     /opt/app/aaf_config/bin/agent.sh local showpass {{.Values.fqi}} {{ .Values.fqdn }} | grep cadi_keystore_password= | cut -d= -f 2 > {{ .Values.credsPath }}/.pass 2>&1
390
391 # dependency / sub-chart configuration
392 network-name-gen:
393   enabled: true
394 mariadb-galera: &mariadbGalera
395   nameOverride: &sdnc-db sdnc-db
396   config: &mariadbGaleraConfig
397     rootPasswordExternalSecret: *rootDbSecret
398     userName: &dbUser sdnctl
399     userCredentialsExternalSecret: *dbSecretName
400   rootUser:
401     externalSecret: *rootDbSecret
402   db:
403     user: *dbUser
404     externalSecret: *dbSecretName
405   service:
406     name: sdnc-dbhost
407   sdnctlPrefix: sdnc
408   persistence:
409     mountSubPath: sdnc/mariadb-galera
410     enabled: true
411   replicaCount: 1
412   serviceAccount:
413     nameOverride: *sdnc-db
414
415 cds:
416   enabled: false
417
418 dmaap-listener:
419   enabled: true
420   nameOverride: sdnc-dmaap-listener
421   mariadb-galera:
422     <<: *mariadbGalera
423     config:
424       <<: *mariadbGaleraConfig
425       mysqlDatabase: *sdncDbName
426   config:
427     sdncChartName: sdnc
428     dmaapPort: 3904
429     sdncPort: 8282
430     configDir: /opt/onap/sdnc/data/properties
431     odlCredsExternalSecret: *odlCredsSecretName
432
433 ueb-listener:
434   enabled: true
435   mariadb-galera:
436     <<: *mariadbGalera
437     config:
438       <<: *mariadbGaleraConfig
439       mysqlDatabase: *sdncDbName
440   nameOverride: sdnc-ueb-listener
441   config:
442     sdncPort: 8282
443     sdncChartName: sdnc
444     configDir: /opt/onap/sdnc/data/properties
445     odlCredsExternalSecret: *odlCredsSecretName
446
447 sdnc-ansible-server:
448   enabled: true
449   config:
450     restCredsExternalSecret: *ansibleSecretName
451   mariadb-galera:
452     <<: *mariadbGalera
453     config:
454       <<: *mariadbGaleraConfig
455       mysqlDatabase: ansible
456   service:
457     name: sdnc-ansible-server
458     internalPort: 8000
459
460 dgbuilder:
461   enabled: true
462   nameOverride: sdnc-dgbuilder
463   certInitializer:
464     nameOverride: sdnc-dgbuilder-cert-initializer
465   config:
466     db:
467       dbName: *sdncDbName
468       rootPasswordExternalSecret: '{{ .Values.global.mariadbGalera.localCluster |
469         ternary
470           (printf "%s-sdnc-db-root-password" (include "common.release" .))
471           (include "common.mariadb.secret.rootPassSecretName"
472             (dict "dot" . "chartName" "mariadb-galera")) }}'
473       userCredentialsExternalSecret: *dbSecretName
474     dbPodName: mariadb-galera
475     dbServiceName: mariadb-galera
476     # This should be revisited and changed to plain text
477     dgUserPassword: cc03e747a6afbbcbf8be7668acfebee5
478   serviceAccount:
479     nameOverride: sdnc-dgbuilder
480   mariadb-galera:
481   service:
482     name: sdnc-dgbuilder
483     nodePort: "03"
484
485   ingress:
486     enabled: false
487     service:
488       - baseaddr: "sdnc-dgbuilder"
489         name: "sdnc-dgbuilder"
490         port: 3000
491       - baseaddr: "sdnc-web-service"
492         name: "sdnc-web-service"
493         port: 8443
494     config:
495       ssl: "redirect"
496
497
498
499 # local elasticsearch cluster
500 localElasticCluster: true
501 elasticsearch:
502   nameOverride: &elasticSearchName sdnrdb
503   name: sdnrdb-cluster
504   certInitializer:
505     fqdn: "sdnc"
506     fqi_namespace: org.onap.sdnc
507     fqi: "sdnc@sdnc.onap.org"
508   service:
509     name: *elasticSearchName
510   master:
511     replicaCount: 3
512     # dedicatednode: "yes"
513     # working as master node only, in this case increase replicaCount for elasticsearch-data
514     # dedicatednode: "no"
515     # handles master and data node functionality
516     dedicatednode: "no"
517     nameOverride: *elasticSearchName
518     cluster_name: sdnrdb-cluster
519
520 # enable
521 sdnc-web:
522   enabled: true
523 # default number of instances
524 replicaCount: 1
525
526 nodeSelector: {}
527
528 affinity: {}
529
530 # probe configuration parameters
531 liveness:
532   initialDelaySeconds: 10
533   periodSeconds: 10
534   # necessary to disable liveness probe when setting breakpoints
535   # in debugger so K8s doesn't restart unresponsive container
536   enabled: true
537
538 readiness:
539   initialDelaySeconds: 10
540   periodSeconds: 10
541
542 service:
543   type: NodePort
544   name: sdnc
545   portName: sdnc
546   internalPort: 8181
547   internalPort2: 8101
548   internalPort3: 8080
549   internalPort4: 8443
550
551   #port
552   externalPort: 8282
553
554   externalPort2: 8202
555
556   externalPort3: 8280
557
558   externalPort4: 8443
559   nodePort4: 67
560
561   clusterPort: 2550
562   clusterPort2: 2650
563   clusterPort3: 2681
564
565   geoNodePort1: 61
566   geoNodePort2: 62
567   geoNodePort3: 63
568   geoNodePort4: 64
569   geoNodePort5: 65
570   geoNodePort6: 66
571
572   callHomePort: 6666
573   callHomeNodePort: 66
574
575 ## Persist data to a persitent volume
576 persistence:
577   enabled: true
578
579   ## A manually managed Persistent Volume and Claim
580   ## Requires persistence.enabled: true
581   ## If defined, PVC must be created manually before volume will be bound
582   # existingClaim:
583   volumeReclaimPolicy: Retain
584
585   ## database data Persistent Volume Storage Class
586   ## If defined, storageClassName: <storageClass>
587   ## If set to "-", storageClassName: "", which disables dynamic provisioning
588   ## If undefined (the default) or set to null, no storageClassName spec is
589   ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
590   ##   GKE, AWS & OpenStack)
591   accessMode: ReadWriteOnce
592   size: 1Gi
593   mountPath: /dockerdata-nfs
594   mountSubPath: sdnc/mdsal
595   mdsalPath: /opt/opendaylight/mdsal
596   daeximPath: /opt/opendaylight/mdsal/daexim
597   journalPath: /opt/opendaylight/segmented-journal
598   snapshotsPath: /opt/opendaylight/snapshots
599
600 certpersistence:
601   enabled: true
602
603   ## A manually managed Persistent Volume and Claim
604   ## Requires persistence.enabled: true
605   ## If defined, PVC must be created manually before volume will be bound
606   # existingClaim:
607
608   volumeReclaimPolicy: Retain
609   accessMode: ReadWriteOnce
610   size: 50Mi
611   mountPath: /dockerdata-nfs
612   mountSubPath: sdnc/certs
613   certPath: /opt/app/osaaf
614   ##storageClass: "manual"
615
616 ingress:
617   enabled: false
618   service:
619     - baseaddr: "sdnc.api"
620       name: "sdnc"
621       port: 8443
622   config:
623     ssl: "redirect"
624
625 #Resource Limit flavor -By Default using small
626 flavor: small
627 #segregation for different envionment (Small and Large)
628
629 resources:
630   small:
631     limits:
632       cpu: 2
633       memory: 4Gi
634     requests:
635       cpu: 1
636       memory: 2Gi
637   large:
638     limits:
639       cpu: 4
640       memory: 8Gi
641     requests:
642       cpu: 2
643       memory: 4Gi
644   unlimited: {}
645
646 #Pods Service Account
647 serviceAccount:
648   nameOverride: sdnc
649   roles:
650     - read