pkgbuild: pkgver=1.16.4 pkgrel=1 (genesis)
This repo was forked from the upstream Archlinux consul package at
commit 4b59c61ed1036182df6fff4621d897312c8c1a6b.
This was then modified to download from the open-consul source, and
slight improvements made to GOFLAGS + tidied up makedepends.
References: https://gitlab.archlinux.org/archlinux/packaging/packages/consul
References: 4b59c61ed1
This commit is contained in:
commit
08c876b42b
|
@ -0,0 +1,25 @@
|
||||||
|
pkgbase = open-consul
|
||||||
|
pkgdesc = A tool for service discovery, monitoring and configuration.
|
||||||
|
pkgver = 1.16.4
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://developer.hashicorp.com/consul/docs/v1.16.x
|
||||||
|
install = consul.install
|
||||||
|
arch = x86_64
|
||||||
|
license = MPL2
|
||||||
|
makedepends = go
|
||||||
|
depends = glibc
|
||||||
|
provides = consul
|
||||||
|
conflicts = consul
|
||||||
|
backup = etc/default/consul
|
||||||
|
source = open-consul-1.16.4.tar.gz::https://git.st8l.com/luxolus/open-consul/archive/25957a17b5eddd1b95ebda13f8a667ec3c02b4c6.tar.gz
|
||||||
|
source = consul.service
|
||||||
|
source = consul.default
|
||||||
|
source = consul.sysusers
|
||||||
|
source = example.json
|
||||||
|
sha512sums = SKIP
|
||||||
|
sha512sums = c70b9d1556f6c7ecb2e915ab685f289cef0e31198bd2e50c74a0483bbfb387beec67334f539a90adbf68b61b07946e98b300ab8a8e26e53b35f4ab4894adeb04
|
||||||
|
sha512sums = ec5a800529a297c709fa383c094ecf106351cf0f8ac7b613b972d415d77fe001088902d7ab805e63e78a8e6360323fec1b795db5a4446df1e21b9b4ed31e7079
|
||||||
|
sha512sums = ef872aedb2bc022a29292b7972a792b22e684c1ccb904a2b2cfec6d8966c28fb19be1452ce060821c419f1b646b236ba2e783175595e4bb6926d164c27a15c87
|
||||||
|
sha512sums = c4292b8f56ee955ed7385a49843fd90d6434029891b3e1e724cb2fc841514c06e2554a26d3937c114371b18c2168c4e64319eb2cbd726ee8b35870df19089348
|
||||||
|
|
||||||
|
pkgname = open-consul
|
|
@ -0,0 +1,89 @@
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/archlinuxpackages,linux,macos,vim
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=archlinuxpackages,linux,macos,vim
|
||||||
|
|
||||||
|
### ArchLinuxPackages ###
|
||||||
|
*.tar
|
||||||
|
*.tar.*
|
||||||
|
*.jar
|
||||||
|
*.exe
|
||||||
|
*.msi
|
||||||
|
*.zip
|
||||||
|
*.tgz
|
||||||
|
*.log
|
||||||
|
*.log.*
|
||||||
|
*.sig
|
||||||
|
|
||||||
|
pkg/
|
||||||
|
src/
|
||||||
|
|
||||||
|
/open-consul*
|
||||||
|
|
||||||
|
### Linux ###
|
||||||
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
|
.nfs*
|
||||||
|
|
||||||
|
### macOS ###
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### macOS Patch ###
|
||||||
|
# iCloud generated files
|
||||||
|
*.icloud
|
||||||
|
|
||||||
|
### Vim ###
|
||||||
|
# Swap
|
||||||
|
[._]*.s[a-v][a-z]
|
||||||
|
!*.svg # comment out if you don't need vector files
|
||||||
|
[._]*.sw[a-p]
|
||||||
|
[._]s[a-rt-v][a-z]
|
||||||
|
[._]ss[a-gi-z]
|
||||||
|
[._]sw[a-p]
|
||||||
|
|
||||||
|
# Session
|
||||||
|
Session.vim
|
||||||
|
Sessionx.vim
|
||||||
|
|
||||||
|
# Temporary
|
||||||
|
.netrwhist
|
||||||
|
# Auto-generated tag files
|
||||||
|
tags
|
||||||
|
# Persistent undo
|
||||||
|
[._]*.un~
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/archlinuxpackages,linux,macos,vim
|
|
@ -0,0 +1,82 @@
|
||||||
|
# Maintainer: Paul Stemmet <aur@luxolus.com>
|
||||||
|
# Contributor: Thore Bödecker <foxxx0@archlinux.org>
|
||||||
|
# Contributor: Felix Yan <felixonmars@archlinux.org>
|
||||||
|
# Contributor: Justin Kromlinger <hashworks@archlinux.org>
|
||||||
|
|
||||||
|
pkgname=open-consul
|
||||||
|
_commit=25957a17b5eddd1b95ebda13f8a667ec3c02b4c6
|
||||||
|
pkgver=1.16.4
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="A tool for service discovery, monitoring and configuration."
|
||||||
|
provides=('consul')
|
||||||
|
conflicts=('consul')
|
||||||
|
arch=('x86_64')
|
||||||
|
url="https://developer.hashicorp.com/consul/docs/v1.16.x"
|
||||||
|
license=('MPL2')
|
||||||
|
depends=('glibc')
|
||||||
|
makedepends=('go')
|
||||||
|
source=("${pkgname}-${pkgver}.tar.gz::https://git.st8l.com/luxolus/${pkgname}/archive/${_commit}.tar.gz"
|
||||||
|
'consul.service'
|
||||||
|
'consul.default'
|
||||||
|
'consul.sysusers'
|
||||||
|
'example.json')
|
||||||
|
install=consul.install
|
||||||
|
backup=('etc/default/consul')
|
||||||
|
sha512sums=('SKIP'
|
||||||
|
'c70b9d1556f6c7ecb2e915ab685f289cef0e31198bd2e50c74a0483bbfb387beec67334f539a90adbf68b61b07946e98b300ab8a8e26e53b35f4ab4894adeb04'
|
||||||
|
'ec5a800529a297c709fa383c094ecf106351cf0f8ac7b613b972d415d77fe001088902d7ab805e63e78a8e6360323fec1b795db5a4446df1e21b9b4ed31e7079'
|
||||||
|
'ef872aedb2bc022a29292b7972a792b22e684c1ccb904a2b2cfec6d8966c28fb19be1452ce060821c419f1b646b236ba2e783175595e4bb6926d164c27a15c87'
|
||||||
|
'c4292b8f56ee955ed7385a49843fd90d6434029891b3e1e724cb2fc841514c06e2554a26d3937c114371b18c2168c4e64319eb2cbd726ee8b35870df19089348')
|
||||||
|
|
||||||
|
export CGO_LDFLAGS="${LDFLAGS}"
|
||||||
|
export CGO_CFLAGS="${CFLAGS}"
|
||||||
|
export CGO_CPPFLAGS="${CPPFLAGS}"
|
||||||
|
export CGO_CXXFLAGS="${CXXFLAGS}"
|
||||||
|
|
||||||
|
export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
|
||||||
|
|
||||||
|
export XC_OSARCH='linux/amd64'
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
cd "${srcdir}/${pkgname}"
|
||||||
|
|
||||||
|
mkdir -p build
|
||||||
|
|
||||||
|
local filename
|
||||||
|
for filename in "${source[@]}"; do
|
||||||
|
if [[ "$filename" =~ \.patch$ ]]; then
|
||||||
|
patch -p1 -N -l -i "$srcdir/${filename##*/}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
go mod download
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cd "${srcdir}/${pkgname}"
|
||||||
|
|
||||||
|
go build -o build ./...
|
||||||
|
}
|
||||||
|
|
||||||
|
check() {
|
||||||
|
cd "${srcdir}/${pkgname}"
|
||||||
|
|
||||||
|
# assert version number from commit hash matches pkgver metadata
|
||||||
|
./build/consul --version | head -1 | grep -qF -- "v${pkgver}"
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "${srcdir}/${pkgname}"
|
||||||
|
|
||||||
|
install -D -d -m750 -o 208 -g 208 "${pkgdir}/var/lib/consul"
|
||||||
|
install -D -d -m750 -o 0 -g 208 "${pkgdir}/etc/consul.d"
|
||||||
|
|
||||||
|
install -D -m644 "${srcdir}/consul.default" "${pkgdir}/etc/default/consul"
|
||||||
|
install -D -m644 -o 0 -g 0 "${srcdir}/example.json" "${pkgdir}/usr/share/doc/consul/config.example.json"
|
||||||
|
install -Dm755 "build/consul" "${pkgdir}/usr/bin/consul"
|
||||||
|
|
||||||
|
install -Dm644 "${srcdir}/consul.service" "${pkgdir}/usr/lib/systemd/system/consul.service"
|
||||||
|
install -Dm644 "${srcdir}/consul.sysusers" "${pkgdir}/usr/lib/sysusers.d/consul.conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim:set ts=2 sw=2 et:
|
|
@ -0,0 +1,31 @@
|
||||||
|
diff -upr b/build-support/functions/20-build.sh c/build-support/functions/20-build.sh
|
||||||
|
--- b/build-support/functions/20-build.sh 2020-03-04 10:15:04.066148196 +0100
|
||||||
|
+++ c/build-support/functions/20-build.sh 2020-03-04 10:13:54.354670580 +0100
|
||||||
|
@@ -458,7 +458,7 @@ function build_consul_local {
|
||||||
|
if [ $os == "windows" ];then
|
||||||
|
binname="consul.exe"
|
||||||
|
fi
|
||||||
|
- debug_run env CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go install -ldflags "${GOLDFLAGS}" -tags "${GOTAGS}" && cp "${MAIN_GOPATH}/bin/${GOBIN_EXTRA}${binname}" "${outdir}/${binname}"
|
||||||
|
+ debug_run env CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go install -ldflags "-linkmode external -extldflags ${EXTLDFLAGS} -s -w ${GOLDFLAGS}" -tags "${GOTAGS}" && cp "${MAIN_GOPATH}/bin/${GOBIN_EXTRA}${binname}" "${outdir}/${binname}"
|
||||||
|
if test $? -ne 0
|
||||||
|
then
|
||||||
|
err "ERROR: Failed to build Consul for ${osarch}"
|
||||||
|
diff -upr b/GNUmakefile c/GNUmakefile
|
||||||
|
--- b/GNUmakefile 2020-03-04 10:14:46.245770467 +0100
|
||||||
|
+++ c/GNUmakefile 2020-03-04 10:15:32.286746368 +0100
|
||||||
|
@@ -17,6 +17,7 @@ MAIN_GOPATH=$(shell go env GOPATH | cut
|
||||||
|
|
||||||
|
ASSETFS_PATH?=agent/bindata_assetfs.go
|
||||||
|
GOLDFLAGS=
|
||||||
|
+EXTLDFLAGS := ${LDFLAGS}
|
||||||
|
|
||||||
|
PROTOFILES?=$(shell find . -name '*.proto' | grep -v 'vendor/')
|
||||||
|
PROTOGOFILES=$(PROTOFILES:.proto=.pb.go)
|
||||||
|
@@ -120,6 +121,7 @@ export GIT_DIRTY
|
||||||
|
export GIT_DESCRIBE
|
||||||
|
export GOTAGS
|
||||||
|
export GOLDFLAGS
|
||||||
|
+export EXTLDFLAGS
|
||||||
|
|
||||||
|
# Allow skipping docker build during integration tests in CI since we already
|
||||||
|
# have a built binary
|
|
@ -0,0 +1 @@
|
||||||
|
CONSUL_FLAGS=""
|
|
@ -0,0 +1,9 @@
|
||||||
|
post_upgrade() {
|
||||||
|
# improved permissions since 0.9.3-1
|
||||||
|
if [ "$(vercmp "$2" "0.9.3")" -lt 0 ]; then
|
||||||
|
chown 0:208 /etc/consul.d
|
||||||
|
chmod 0750 /etc/consul.d
|
||||||
|
echo -en "----\nThe directory permissions for /etc/consul.d/ have been fixed.\n----\n"
|
||||||
|
fi
|
||||||
|
true
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Consul Agent
|
||||||
|
Requires=network-online.target
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=consul
|
||||||
|
Group=consul
|
||||||
|
EnvironmentFile=-/etc/default/consul
|
||||||
|
Restart=on-failure
|
||||||
|
ExecStart=/usr/bin/consul agent $CONSUL_FLAGS -config-dir=/etc/consul.d
|
||||||
|
ExecReload=/usr/bin/kill -HUP $MAINPID
|
||||||
|
KillSignal=SIGINT
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -0,0 +1 @@
|
||||||
|
u consul 208 - /var/lib/consul
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"data_dir": "/var/lib/consul",
|
||||||
|
"disable_update_check": true,
|
||||||
|
"log_level": "INFO",
|
||||||
|
"node_name": "example.localdomain",
|
||||||
|
"server": true
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
--- a/version/version.go 2018-06-26 09:57:33.703932696 +0200
|
||||||
|
+++ b/version/version.go 2018-06-26 09:59:05.986536238 +0200
|
||||||
|
@@ -1,7 +1,6 @@
|
||||||
|
package version
|
||||||
|
|
||||||
|
import (
|
||||||
|
- "fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -27,24 +26,6 @@ var (
|
||||||
|
// for displaying to humans.
|
||||||
|
func GetHumanVersion() string {
|
||||||
|
version := Version
|
||||||
|
- if GitDescribe != "" {
|
||||||
|
- version = GitDescribe
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- release := VersionPrerelease
|
||||||
|
- if GitDescribe == "" && release == "" {
|
||||||
|
- release = "dev"
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if release != "" {
|
||||||
|
- if !strings.HasSuffix(version, "-"+release) {
|
||||||
|
- // if we tagged a prerelease version then the release is in the version already
|
||||||
|
- version += fmt.Sprintf("-%s", release)
|
||||||
|
- }
|
||||||
|
- if GitCommit != "" {
|
||||||
|
- version += fmt.Sprintf(" (%s)", GitCommit)
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
|
||||||
|
// Strip off any single quotes added by the git information.
|
||||||
|
return strings.Replace(version, "'", "", -1)
|
||||||
|
--- a/GNUmakefile 2020-02-20 16:40:00.000000000 +0100
|
||||||
|
+++ b/GNUmakefile 2020-03-04 09:48:52.279500949 +0100
|
||||||
|
@@ -16,13 +16,7 @@ GOPATH=$(shell go env GOPATH)
|
||||||
|
MAIN_GOPATH=$(shell go env GOPATH | cut -d: -f1)
|
||||||
|
|
||||||
|
ASSETFS_PATH?=agent/bindata_assetfs.go
|
||||||
|
-# Get the git commit
|
||||||
|
-GIT_COMMIT?=$(shell git rev-parse --short HEAD)
|
||||||
|
-GIT_COMMIT_YEAR?=$(shell git show -s --format=%cd --date=format:%Y HEAD)
|
||||||
|
-GIT_DIRTY?=$(shell test -n "`git status --porcelain`" && echo "+CHANGES" || true)
|
||||||
|
-GIT_DESCRIBE?=$(shell git describe --tags --always --match "v*")
|
||||||
|
-GIT_IMPORT=github.com/hashicorp/consul/version
|
||||||
|
-GOLDFLAGS=-X $(GIT_IMPORT).GitCommit=$(GIT_COMMIT)$(GIT_DIRTY) -X $(GIT_IMPORT).GitDescribe=$(GIT_DESCRIBE)
|
||||||
|
+GOLDFLAGS=
|
||||||
|
|
||||||
|
PROTOFILES?=$(shell find . -name '*.proto' | grep -v 'vendor/')
|
||||||
|
PROTOGOFILES=$(PROTOFILES:.proto=.pb.go)
|
||||||
|
@@ -348,16 +342,6 @@ tools:
|
||||||
|
fi
|
||||||
|
cd .gotools && go get -v $(GOTOOLS)
|
||||||
|
|
||||||
|
-version:
|
||||||
|
- @echo -n "Version: "
|
||||||
|
- @$(SHELL) $(CURDIR)/build-support/scripts/version.sh
|
||||||
|
- @echo -n "Version + release: "
|
||||||
|
- @$(SHELL) $(CURDIR)/build-support/scripts/version.sh -r
|
||||||
|
- @echo -n "Version + git: "
|
||||||
|
- @$(SHELL) $(CURDIR)/build-support/scripts/version.sh -g
|
||||||
|
- @echo -n "Version + release + git: "
|
||||||
|
- @$(SHELL) $(CURDIR)/build-support/scripts/version.sh -r -g
|
||||||
|
-
|
||||||
|
|
||||||
|
docker-images: go-build-image ui-build-image
|
||||||
|
|
||||||
|
@@ -409,4 +393,4 @@ proto: $(PROTOGOFILES) $(PROTOGOBINFILES
|
||||||
|
|
||||||
|
.PHONY: all ci bin dev dist cov test test-ci test-internal cover format vet ui static-assets tools
|
||||||
|
.PHONY: docker-images go-build-image ui-build-image static-assets-docker consul-docker ui-docker
|
||||||
|
-.PHONY: version proto proto-rebuild proto-delete test-envoy-integ
|
||||||
|
+.PHONY: proto proto-rebuild proto-delete test-envoy-integ
|
|
@ -0,0 +1,11 @@
|
||||||
|
--- a/GNUmakefile 2020-02-20 16:40:00.000000000 +0100
|
||||||
|
+++ b/GNUmakefile 2020-03-04 09:51:30.786193388 +0100
|
||||||
|
@@ -212,7 +212,7 @@ cov: other-consul dev-build
|
||||||
|
rm -f coverage.{sdk,api}.part
|
||||||
|
go tool cover -html=coverage.out
|
||||||
|
|
||||||
|
-test: other-consul dev-build vet test-internal
|
||||||
|
+test: other-consul dev-build test-internal
|
||||||
|
|
||||||
|
go-mod-tidy:
|
||||||
|
@echo "--> Running go mod tidy"
|
|
@ -0,0 +1,54 @@
|
||||||
|
diff -upr a/agent/cache/cache_test.go b/agent/cache/cache_test.go
|
||||||
|
--- a/agent/cache/cache_test.go 2018-11-14 23:37:47.000000000 +0100
|
||||||
|
+++ b/agent/cache/cache_test.go 2019-01-08 15:23:12.540631267 +0100
|
||||||
|
@@ -213,7 +213,6 @@ func TestCacheGet_blockingInitSameKey(t
|
||||||
|
// Test that Get with different cache keys both block on initial value
|
||||||
|
// but that the fetches were both properly called.
|
||||||
|
func TestCacheGet_blockingInitDiffKeys(t *testing.T) {
|
||||||
|
- t.Parallel()
|
||||||
|
|
||||||
|
require := require.New(t)
|
||||||
|
|
||||||
|
@@ -299,7 +298,6 @@ func TestCacheGet_blockingIndex(t *testi
|
||||||
|
// Test a get with an index set will timeout if the fetch doesn't return
|
||||||
|
// anything.
|
||||||
|
func TestCacheGet_blockingIndexTimeout(t *testing.T) {
|
||||||
|
- t.Parallel()
|
||||||
|
|
||||||
|
typ := TestType(t)
|
||||||
|
defer typ.AssertExpectations(t)
|
||||||
|
@@ -438,7 +436,6 @@ func TestCacheGet_emptyFetchResult(t *te
|
||||||
|
// Test that a type registered with a periodic refresh will perform
|
||||||
|
// that refresh after the timer is up.
|
||||||
|
func TestCacheGet_periodicRefresh(t *testing.T) {
|
||||||
|
- t.Parallel()
|
||||||
|
|
||||||
|
typ := TestType(t)
|
||||||
|
defer typ.AssertExpectations(t)
|
||||||
|
@@ -525,7 +522,6 @@ func TestCacheGet_periodicRefreshMultipl
|
||||||
|
|
||||||
|
// Test that a refresh performs a backoff.
|
||||||
|
func TestCacheGet_periodicRefreshErrorBackoff(t *testing.T) {
|
||||||
|
- t.Parallel()
|
||||||
|
|
||||||
|
typ := TestType(t)
|
||||||
|
defer typ.AssertExpectations(t)
|
||||||
|
@@ -566,7 +562,6 @@ func TestCacheGet_periodicRefreshErrorBa
|
||||||
|
|
||||||
|
// Test that a badly behaved RPC that returns 0 index will perform a backoff.
|
||||||
|
func TestCacheGet_periodicRefreshBadRPCZeroIndexErrorBackoff(t *testing.T) {
|
||||||
|
- t.Parallel()
|
||||||
|
|
||||||
|
typ := TestType(t)
|
||||||
|
defer typ.AssertExpectations(t)
|
||||||
|
diff -upr a/agent/cache-types/connect_ca_leaf_test.go b/agent/cache-types/connect_ca_leaf_test.go
|
||||||
|
--- a/agent/cache-types/connect_ca_leaf_test.go 2018-11-14 23:37:47.000000000 +0100
|
||||||
|
+++ b/agent/cache-types/connect_ca_leaf_test.go 2019-01-08 15:23:55.670339830 +0100
|
||||||
|
@@ -870,7 +870,6 @@ func TestConnectCALeaf_changingRoots(t *
|
||||||
|
// Test that after an initial signing, an expiringLeaf will trigger a
|
||||||
|
// blocking query to resign.
|
||||||
|
func TestConnectCALeaf_expiringLeaf(t *testing.T) {
|
||||||
|
- t.Parallel()
|
||||||
|
|
||||||
|
require := require.New(t)
|
||||||
|
rpc := TestRPC(t)
|
Loading…
Reference in New Issue